X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fmain%2FPackageConfig.hs;h=1602429f64d6b79f44b30a9fcd2c314b38cebbb9;hb=9bcd95bad83ee937c178970e8b729732e680fe1e;hp=c070ca2efb772b285855d309af191ab71c38e26e;hpb=1a7d1b77334529ca96ed4cbc03fcb5f55dc2de4a;p=ghc-hetmet.git diff --git a/compiler/main/PackageConfig.hs b/compiler/main/PackageConfig.hs index c070ca2..1602429 100644 --- a/compiler/main/PackageConfig.hs +++ b/compiler/main/PackageConfig.hs @@ -2,61 +2,93 @@ -- (c) The University of Glasgow, 2004 -- +-- | Package configuration information: essentially the interface to Cabal, with some utilities module PackageConfig ( + -- $package_naming + -- * PackageId mkPackageId, packageConfigId, unpackPackageId, -- * The PackageConfig type: information about a package PackageConfig, - InstalledPackageInfo_(..), showPackageId, + InstalledPackageInfo_(..), display, Version(..), PackageIdentifier(..), defaultPackageConfig, + packageConfigToInstalledPackageInfo, + installedPackageInfoToPackageConfig, ) where #include "HsVersions.h" -import Module +import Data.Maybe +import Module import Distribution.InstalledPackageInfo -import Distribution.Package +import Distribution.ModuleName +import Distribution.Package hiding (PackageId) +import Distribution.Text import Distribution.Version -import Distribution.Compat.ReadP ( readP_to_S ) - --- warning suppression -_unused :: FS.FastString -_unused = FSLIT("") +import Distribution.Compat.ReadP -- ----------------------------------------------------------------------------- -- Our PackageConfig type is just InstalledPackageInfo from Cabal. Later we -- might need to extend it with some GHC-specific stuff, but for now it's fine. -type PackageConfig = InstalledPackageInfo_ ModuleName +type PackageConfig = InstalledPackageInfo_ Module.ModuleName defaultPackageConfig :: PackageConfig defaultPackageConfig = emptyInstalledPackageInfo -- ----------------------------------------------------------------------------- -- PackageId (package names with versions) --- Mostly the compiler deals in terms of PackageNames, which don't +-- $package_naming +-- #package_naming# +-- Mostly the compiler deals in terms of 'PackageName's, which don't -- have the version suffix. This is so that we don't need to know the --- version for the -package-name flag, or know the versions of --- wired-in packages like base & rts. Versions are confined to the +-- version for the @-package-name@ flag, or know the versions of +-- wired-in packages like @base@ & @rts@. Versions are confined to the -- package sub-system. -- -- This means that in theory you could have multiple base packages installed --- (for example), and switch between them using -package/-hide-package. +-- (for example), and switch between them using @-package@\/@-hide-package@. -- --- A PackageId is a string of the form -. +-- A 'PackageId' is a string of the form @-@. +-- | Turn a Cabal 'PackageIdentifier' into a GHC 'PackageId' mkPackageId :: PackageIdentifier -> PackageId -mkPackageId = stringToPackageId . showPackageId +mkPackageId = stringToPackageId . display +-- | Get the GHC 'PackageId' right out of a Cabalish 'PackageConfig' packageConfigId :: PackageConfig -> PackageId packageConfigId = mkPackageId . package +-- | Try and interpret a GHC 'PackageId' as a cabal 'PackageIdentifer'. Returns @Nothing@ if +-- we could not parse it as such an object. unpackPackageId :: PackageId -> Maybe PackageIdentifier unpackPackageId p - = case [ pid | (pid,"") <- readP_to_S parsePackageId str ] of + = case [ pid | (pid,"") <- readP_to_S parse str ] of [] -> Nothing (pid:_) -> Just pid where str = packageIdString p + +-- | Turn a 'PackageConfig', which contains GHC 'Module.ModuleName's into a Cabal specific +-- 'InstalledPackageInfo' which contains Cabal 'Distribution.ModuleName.ModuleName's +packageConfigToInstalledPackageInfo :: PackageConfig -> InstalledPackageInfo +packageConfigToInstalledPackageInfo + (pkgconf@(InstalledPackageInfo { exposedModules = e, + hiddenModules = h })) = + pkgconf{ exposedModules = map convert e, + hiddenModules = map convert h } + where convert :: Module.ModuleName -> Distribution.ModuleName.ModuleName + convert = fromJust . simpleParse . moduleNameString + +-- | Turn an 'InstalledPackageInfo', which contains Cabal 'Distribution.ModuleName.ModuleName's +-- into a GHC specific 'PackageConfig' which contains GHC 'Module.ModuleName's +installedPackageInfoToPackageConfig :: InstalledPackageInfo -> PackageConfig +installedPackageInfoToPackageConfig + (pkgconf@(InstalledPackageInfo { exposedModules = e, + hiddenModules = h })) = + pkgconf{ exposedModules = map convert e, + hiddenModules = map convert h } + where convert :: Distribution.ModuleName.ModuleName -> Module.ModuleName + convert = mkModuleName . display