From 0a1a2f75bc29c02349335a68e488d8fecd73156e Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Wed, 30 Sep 2015 14:45:08 +0300 Subject: [PATCH] Pass -package-id to ghci (closes #867) --- ChangeLog.md | 1 + src/Stack/Build/Installed.hs | 2 -- src/Stack/Ghci.hs | 16 +++++++++++++--- src/Stack/Package.hs | 18 ++++++++++++------ src/Stack/Types/Build.hs | 3 --- src/Stack/Types/Package.hs | 8 ++++++++ 6 files changed, 34 insertions(+), 14 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 39208ffc33..b2d1dd2165 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -29,6 +29,7 @@ Bug fixes: * Fix quoting of output failed command line arguments * Mark executable-only packages as installed when copied from cache [#1043](https://github.com/commercialhaskell/stack/pull/1043) * Canonicalize temporary directory paths [#1047](https://github.com/commercialhaskell/stack/pull/1047) +* Pass -package-id to ghci [#867](https://github.com/commercialhaskell/stack/issues/867) ## 0.1.5.0 diff --git a/src/Stack/Build/Installed.hs b/src/Stack/Build/Installed.hs index f4da4bf917..775d5fe15c 100644 --- a/src/Stack/Build/Installed.hs +++ b/src/Stack/Build/Installed.hs @@ -47,8 +47,6 @@ data LoadHelper = LoadHelper } deriving Show -type InstalledMap = Map PackageName (Version, InstallLocation, Installed) -- TODO Version is now redundant and can be gleaned from Installed - -- | Options for 'getInstalled'. data GetInstalledOpts = GetInstalledOpts { getInstalledProfiling :: !Bool diff --git a/src/Stack/Ghci.hs b/src/Stack/Ghci.hs index eb6535fb98..4c56cd8bc2 100644 --- a/src/Stack/Ghci.hs +++ b/src/Stack/Ghci.hs @@ -30,6 +30,7 @@ import Network.HTTP.Client.Conduit import Path import Prelude import Stack.Build +import Stack.Build.Installed import Stack.Build.Source import Stack.Build.Target import Stack.Constants @@ -177,6 +178,14 @@ ghciSetup mainIs stringTargets = do let bopts = makeBuildOpts targets econfig <- asks getEnvConfig (realTargets,_,_,_,sourceMap) <- loadSourceMap AllowNoTargets bopts + menv <- getMinimalEnvOverride + (installedMap, _, _) <- getInstalled + menv + GetInstalledOpts + { getInstalledProfiling = False + , getInstalledHaddock = False + } + sourceMap locals <- liftM catMaybes $ forM (M.toList (envConfigPackages econfig)) $ @@ -192,7 +201,7 @@ ghciSetup mainIs stringTargets = do infos <- forM locals $ \(name,(cabalfp,components)) -> - makeGhciPkgInfo sourceMap (map fst locals) name cabalfp components + makeGhciPkgInfo sourceMap installedMap (map fst locals) name cabalfp components unless (M.null realTargets) (build (const (return ())) Nothing bopts) return (realTargets, mainIsTargets, infos) where @@ -231,12 +240,13 @@ ghciSetup mainIs stringTargets = do makeGhciPkgInfo :: (MonadReader r m, HasEnvConfig r, MonadLogger m, MonadIO m, MonadCatch m) => SourceMap + -> InstalledMap -> [PackageName] -> PackageName -> Path Abs File -> SimpleTarget -> m GhciPkgInfo -makeGhciPkgInfo sourceMap locals name cabalfp components = do +makeGhciPkgInfo sourceMap installedMap locals name cabalfp components = do econfig <- asks getEnvConfig bconfig <- asks getBuildConfig let config = @@ -250,7 +260,7 @@ makeGhciPkgInfo sourceMap locals name cabalfp components = do (warnings,pkg) <- readPackage config cabalfp mapM_ (printCabalFileWarning cabalfp) warnings (componentsModules,componentFiles,componentsOpts,generalOpts) <- - getPackageOpts (packageOpts pkg) sourceMap locals cabalfp + getPackageOpts (packageOpts pkg) sourceMap installedMap locals cabalfp let filterWithinWantedComponents m = M.elems (M.filterWithKey diff --git a/src/Stack/Package.hs b/src/Stack/Package.hs index db7ab6a58d..2b467a4c94 100644 --- a/src/Stack/Package.hs +++ b/src/Stack/Package.hs @@ -74,6 +74,7 @@ import Path.Find import Path.IO import Prelude import Safe (headDef, tailSafe) +import Stack.Build.Installed import Stack.Constants import Stack.Types import qualified Stack.Types.PackageIdentifier @@ -194,10 +195,10 @@ resolvePackage packageConfig gpkg = [T.pack (exeName b) | b <- executables pkg , buildable (buildInfo b)] , packageOpts = GetPackageOpts $ - \sourceMap locals cabalfp -> + \sourceMap installedMap locals cabalfp -> do (componentsModules,componentFiles,_,_) <- getPackageFiles pkgFiles cabalfp (componentsOpts,generalOpts) <- - generatePkgDescOpts sourceMap locals cabalfp pkg componentFiles + generatePkgDescOpts sourceMap installedMap locals cabalfp pkg componentFiles return (componentsModules,componentFiles,componentsOpts,generalOpts) , packageHasExposedModules = maybe False @@ -227,12 +228,13 @@ resolvePackage packageConfig gpkg = generatePkgDescOpts :: (HasEnvConfig env, HasPlatform env, MonadThrow m, MonadReader env m, MonadIO m) => SourceMap + -> InstalledMap -> [PackageName] -> Path Abs File -> PackageDescription -> Map NamedComponent (Set DotCabalPath) -> m (Map NamedComponent [String],[String]) -generatePkgDescOpts sourceMap locals cabalfp pkg componentPaths = do +generatePkgDescOpts sourceMap installedMap locals cabalfp pkg componentPaths = do distDir <- distDirFromDir cabalDir let cabalmacros = autogenDir distDir $(mkRelFile "cabal_macros.h") exists <- fileExists cabalmacros @@ -244,6 +246,7 @@ generatePkgDescOpts sourceMap locals cabalfp pkg componentPaths = do ( namedComponent , generateBuildInfoOpts sourceMap + installedMap mcabalmacros cabalDir distDir @@ -283,6 +286,7 @@ generatePkgDescOpts sourceMap locals cabalfp pkg componentPaths = do -- | Generate GHC options for the target. generateBuildInfoOpts :: SourceMap + -> InstalledMap -> Maybe (Path Abs File) -> Path Abs Dir -> Path Abs Dir @@ -291,7 +295,7 @@ generateBuildInfoOpts -> Set DotCabalPath -> NamedComponent -> [String] -generateBuildInfoOpts sourceMap mcabalmacros cabalDir distDir locals b dotCabalPaths componentName = +generateBuildInfoOpts sourceMap installedMap mcabalmacros cabalDir distDir locals b dotCabalPaths componentName = nubOrd (concat [ghcOpts b, extOpts b, srcOpts, includeOpts, macros, deps, extra b, extraDirs, fworks b, cObjectFiles]) where cObjectFiles = @@ -301,8 +305,10 @@ generateBuildInfoOpts sourceMap mcabalmacros cabalDir distDir locals b dotCabalP cfiles = mapMaybe dotCabalCFilePath (S.toList dotCabalPaths) deps = concat - [ ["-package=" <> display name <> - maybe "" -- This empty case applies to e.g. base. + [ case M.lookup (fromCabalPackageName name) installedMap of + Just (_, _, Stack.Types.Library _ident ipid) -> ["-package-id=" <> ghcPkgIdString ipid] + _ -> ["-package=" <> display name <> + maybe "" -- This empty case applies to e.g. base. ((("-" <>) . versionString) . sourceVersion) (M.lookup (fromCabalPackageName name) sourceMap)] | Dependency name _ <- targetBuildDepends b diff --git a/src/Stack/Types/Build.hs b/src/Stack/Types/Build.hs index 67d49bec1c..81b3d23873 100644 --- a/src/Stack/Types/Build.hs +++ b/src/Stack/Types/Build.hs @@ -718,9 +718,6 @@ modTime x = , toRational (utctDayTime x)) -data Installed = Library PackageIdentifier GhcPkgId | Executable PackageIdentifier - deriving (Show, Eq, Ord) - -- | Configure options to be sent to Setup.hs configure data ConfigureOpts = ConfigureOpts { coDirs :: ![String] diff --git a/src/Stack/Types/Package.hs b/src/Stack/Types/Package.hs index 0f557401e4..94c5e1ad1b 100644 --- a/src/Stack/Types/Package.hs +++ b/src/Stack/Types/Package.hs @@ -36,7 +36,9 @@ import Prelude import Stack.Types.Compiler import Stack.Types.Config import Stack.Types.FlagName +import Stack.Types.GhcPkgId import Stack.Types.PackageName +import Stack.Types.PackageIdentifier import Stack.Types.Version -- | All exceptions thrown by the library. @@ -98,6 +100,7 @@ data Package = newtype GetPackageOpts = GetPackageOpts { getPackageOpts :: forall env m. (MonadIO m,HasEnvConfig env, HasPlatform env, MonadThrow m, MonadReader env m, MonadLogger m, MonadCatch m) => SourceMap + -> InstalledMap -> [PackageName] -> Path Abs File -> m (Map NamedComponent (Set ModuleName) @@ -322,3 +325,8 @@ dotCabalGetPath dcp = DotCabalMainPath fp -> fp DotCabalFilePath fp -> fp DotCabalCFilePath fp -> fp + +type InstalledMap = Map PackageName (Version, InstallLocation, Installed) -- TODO Version is now redundant and can be gleaned from Installed + +data Installed = Library PackageIdentifier GhcPkgId | Executable PackageIdentifier + deriving (Show, Eq, Ord)