X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fmain%2FPackageConfig.hs;h=50c1e7105aeea53f25f0044271e49a375fc13b57;hp=5193113717d0d54aa756f61dd62a1625a85bec46;hb=d0faaa6fa0cecd23c5670fd199e9206275313666;hpb=853809226e2d1d168f47b93ace019cd0a246e9a9 diff --git a/compiler/main/PackageConfig.hs b/compiler/main/PackageConfig.hs index 5193113..50c1e71 100644 --- a/compiler/main/PackageConfig.hs +++ b/compiler/main/PackageConfig.hs @@ -2,112 +2,81 @@ -- (c) The University of Glasgow, 2004 -- +-- | Package configuration information: essentially the interface to Cabal, with some utilities module PackageConfig ( + -- $package_naming + -- * PackageId - PackageId, - mkPackageId, stringToPackageId, packageIdString, packageConfigId, - packageIdFS, fsToPackageId, unpackPackageId, + mkPackageId, packageConfigId, -- * The PackageConfig type: information about a package PackageConfig, - InstalledPackageInfo(..), showPackageId, + InstalledPackageInfo_(..), display, Version(..), PackageIdentifier(..), defaultPackageConfig, - - -- * Wired-in PackageIds - basePackageId, - rtsPackageId, - haskell98PackageId, - thPackageId, - mainPackageId + packageConfigToInstalledPackageInfo, + installedPackageInfoToPackageConfig, ) where #include "HsVersions.h" +import Maybes +import Module import Distribution.InstalledPackageInfo -import Distribution.Package +import Distribution.ModuleName +import Distribution.Package hiding (PackageId) +import Distribution.Text import Distribution.Version -import FastString -import Distribution.Compat.ReadP ( readP_to_S ) -- ----------------------------------------------------------------------------- -- 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 +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 -. - -newtype PackageId = PId FastString deriving( Eq, Ord ) -- includes the version - -- easier not to use a newtype here, because we need instances of - -- Binary & Outputable, and we're too early to define them - -fsToPackageId :: FastString -> PackageId -fsToPackageId = PId - -packageIdFS :: PackageId -> FastString -packageIdFS (PId fs) = fs - -stringToPackageId :: String -> PackageId -stringToPackageId = fsToPackageId . mkFastString - -packageIdString :: PackageId -> String -packageIdString = unpackFS . packageIdFS +-- 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 - -unpackPackageId :: PackageId -> Maybe PackageIdentifier -unpackPackageId p - = case [ pid | (pid,"") <- readP_to_S parsePackageId str ] of - [] -> Nothing - (pid:_) -> Just pid - where str = packageIdString p - --- ----------------------------------------------------------------------------- --- Package Ids that are wired in - --- Certain packages are "known" to the compiler, in that we know about certain --- entities that reside in these packages, and the compiler needs to --- declare static Modules and Names that refer to these packages. Hence --- the wired-in packages can't include version numbers, since we don't want --- to bake the version numbers of these packages into GHC. --- --- So here's the plan. Wired-in packages are still versioned as --- normal in the packages database, and you can still have multiple --- versions of them installed. However, for each invocation of GHC, --- only a single instance of each wired-in package will be recognised --- (the desired one is selected via -package/-hide-package), and GHC --- will use the unversioned PackageId below when referring to it, --- including in .hi files and object file symbols. Unselected --- versions of wired-in packages will be ignored, as will any other --- package that depends directly or indirectly on it (much as if you --- had used -ignore-package). - -basePackageId = fsToPackageId FSLIT("base") -rtsPackageId = fsToPackageId FSLIT("rts") -haskell98PackageId = fsToPackageId FSLIT("haskell98") -thPackageId = fsToPackageId FSLIT("template-haskell") - --- This is the package Id for the program. It is the default package --- Id if you don't specify a package name. We don't add this prefix --- to symbol name, since there can be only one main package per program. -mainPackageId = fsToPackageId FSLIT("main") - +packageConfigId = mkPackageId . sourcePackageId + +-- | 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 = (expectJust "packageConfigToInstalledPackageInfo") . 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_ String -> PackageConfig +installedPackageInfoToPackageConfig + (pkgconf@(InstalledPackageInfo { exposedModules = e, + hiddenModules = h })) = + pkgconf{ exposedModules = map mkModuleName e, + hiddenModules = map mkModuleName h }