質問

具体的には、与えられarbritaryパッケージで仲良く添い寝はいかが取得する際に必要と同じ library-dirs 分野で得られることができるの ghc-pkg describe コマンド内からのランニングウプログラム。

役に立ちましたか?

解決

ここで私はghc-pkgのソースコードに覗くことにより、思い付くことができるものです。

getPkgInfos関数は、(たぶんユーザーがインストールパッケージを含む)すべてのインストール済みパッケージのパッケージ定義を返します。あなたの手でこれを使用すると、ライブラリディレクトリおよびその他のパッケージ情報を取得することができます。以下のためのドキュメントを参照してください。詳細ます。

GHC_PKGCONF変数は、それがいつもの場所に位置していないシステムのためのグローバル・パッケージの設定ファイルを指している必要があります。 ghc-pkgは、例えば、Ubuntuのにラッパー・スクリプトを介して、コマンド・ライン・フラグを受信することにより、この問題を解決します。

import qualified Config
import qualified System.Info
import Data.List
import Distribution.InstalledPackageInfo
import GHC.Paths
import System.Directory
import System.Environment
import System.FilePath
import System.IO.Error

getPkgInfos :: IO [InstalledPackageInfo]
getPkgInfos = do
    global_conf <-
        catch (getEnv "GHC_PKGCONF")
              (\err ->  if isDoesNotExistError err
                            then do let dir = takeDirectory $ takeDirectory ghc_pkg
                                        path1 = dir </> "package.conf"
                                        path2 = dir </> ".." </> ".." </> ".."
                                                    </> "inplace-datadir"
                                                    </> "package.conf"
                                    exists1 <- doesFileExist path1
                                    exists2 <- doesFileExist path2
                                    if exists1 then return path1
                                       else if exists2 then return path2
                                       else ioError $ userError "Can't find package.conf"
                            else ioError err)

    let global_conf_dir = global_conf ++ ".d"
    global_conf_dir_exists <- doesDirectoryExist global_conf_dir
    global_confs <-
        if global_conf_dir_exists
            then do files <- getDirectoryContents global_conf_dir
                    return  [ global_conf_dir ++ '/' : file
                            | file <- files
                            , isSuffixOf ".conf" file]
            else return []

    user_conf <-
        try (getAppUserDataDirectory "ghc") >>= either
            (\_ -> return [])
            (\appdir -> do
                let subdir = currentArch ++ '-':currentOS ++ '-':ghcVersion
                    user_conf = appdir </> subdir </> "package.conf"
                user_exists <- doesFileExist user_conf
                return (if user_exists then [user_conf] else []))

    let pkg_dbs = user_conf ++ global_confs ++ [global_conf]
    return.concat =<< mapM ((>>= return.read).readFile) pkg_dbs

currentArch = System.Info.arch
currentOS = System.Info.os
ghcVersion = Config.cProjectVersion

私はこのコードを自分で書いたが、それは主に(そのままコピーいくつかの作品で)GHC-PKGに触発されました。元のコードはBSDスタイルのライセンスの下でライセンスされた、私はこれは、すべてのstackoverflowの内容は下にあるCC-ウィキライセンスの下で配布することができると思いますが、私は本当にわかりません。とにかく、何か他のものとして、私はいくつかの初期テストを行なったし、動作しているようですが、ご自身の責任でそれを使用します。

他のヒント

のフォーマットを設置パッケージのデータベース Distribution.InstalledPackageInfo.

import Distribution.InstalledPackageInfo
import Distribution.Package
import Distribution.Text
import GHC.Paths
import System
import System.FilePath
main = do
    name:_ <- getArgs
    packages <- fmap read $ readFile $ joinPath [libdir, "package.conf"]
    let matches = filter ((PackageName name ==) . pkgName . package) packages
    mapM_ (print . libraryDirs) (matches :: [InstalledPackageInfo_ String])

これは当てはまりませんを守り、ユーザーのパッケージの構成できます。

ハスケル・カフェ@または徒党メーリングリスト上でダンカン・カッツを確認して下さい。 (私は深刻だ。それはスタックオーバーフローよりも派閥の質問のためのより良いフォーラムです)。

時には、あなただけの別のフォーラムで、人々を指すようにしています。

あなたがあなたのプログラム/ライブラリを設定し、構築するために徒党を使用している場合は、

あなたは自動生成されたPaths_ *モジュールを使用することができます。

あなたはfoo.cabalファイルを持っている場合は、

たとえば、秘密グループは、インポートすることができた(Paths_fooの下にそのソースを参照してください)dist/build/autogenモジュールを生成します。このモジュールは、あなたが探している値を持つ関数getLibDir :: IO FilePathをエクスポートします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top