diff --git a/cabal-install/Distribution/Client/Sandbox.hs b/cabal-install/Distribution/Client/Sandbox.hs index 57add3f47ea58ffa7c5c67b240603239625edaff..68b113c17535e4b668b1d93f56f0b5eeec7a6172 100644 --- a/cabal-install/Distribution/Client/Sandbox.hs +++ b/cabal-install/Distribution/Client/Sandbox.hs @@ -36,9 +36,9 @@ module Distribution.Client.Sandbox ( ) where import Distribution.Client.Setup - ( SandboxFlags(..), ConfigFlags(..), GlobalFlags(..), InstallFlags(..) - , defaultConfigExFlags, defaultInstallFlags, defaultSandboxLocation - , globalRepos ) + ( SandboxFlags(..), ConfigFlags(..), ConfigExFlags(..), InstallFlags(..) + , GlobalFlags(..), defaultConfigExFlags, defaultInstallFlags + , defaultSandboxLocation, globalRepos ) import Distribution.Client.Sandbox.Timestamp ( maybeAddCompilerTimestampRecord , withAddTimestamps , withRemoveTimestamps @@ -434,21 +434,15 @@ maybeWithSandboxDirOnSearchPath (UseSandbox sandboxDir) act = data WereDepsReinstalled = ReinstalledSomeDeps | NoDepsReinstalled -- | Reinstall those add-source dependencies that have been modified since --- we've last installed them. -reinstallAddSourceDeps :: Verbosity -> SavedConfig -> Flag (Maybe Int) - -> FilePath -> GlobalFlags +-- we've last installed them. Assumes that we're working inside a sandbox. +reinstallAddSourceDeps :: Verbosity + -> SavedConfig + -> ConfigFlags -> ConfigExFlags + -> InstallFlags -> GlobalFlags + -> FilePath -> IO WereDepsReinstalled -reinstallAddSourceDeps verbosity config numJobsFlag sandboxDir globalFlags = do - let configFlags = savedConfigureFlags config - configExFlags = defaultConfigExFlags `mappend` - savedConfigureExFlags config - installFlags' = defaultInstallFlags `mappend` - savedInstallFlags config - installFlags = installFlags' { - installNumJobs = installNumJobs installFlags' `mappend` numJobsFlag - } - globalFlags' = savedGlobalFlags config `mappend` globalFlags - +reinstallAddSourceDeps verbosity config configFlags configExFlags + installFlags globalFlags sandboxDir = do indexFile <- tryGetIndexFilePath config buildTreeRefs <- Index.listBuildTreeRefs verbosity Index.DontListIgnored indexFile @@ -469,9 +463,9 @@ reinstallAddSourceDeps verbosity config numJobsFlag sandboxDir globalFlags = do let args :: InstallArgs args = ((configPackageDB' configFlags ForceGlobalInstall) - ,(globalRepos globalFlags') + ,(globalRepos globalFlags) ,comp, platform, conf - ,globalFlags', configFlags, configExFlags, installFlags + ,globalFlags, configFlags, configExFlags, installFlags ,mempty) logMsg message rest = debugNoWrap verbosity message >> rest @@ -486,7 +480,7 @@ reinstallAddSourceDeps verbosity config numJobsFlag sandboxDir globalFlags = do makeInstallContext verbosity args targets toPrune <- resolveUserTargets verbosity - (fromFlag $ globalWorldFile globalFlags') + (fromFlag $ globalWorldFile globalFlags) (packageIndex sourcePkgDb) targetsToPrune @@ -505,7 +499,7 @@ reinstallAddSourceDeps verbosity config numJobsFlag sandboxDir globalFlags = do -- case. maybeReinstallAddSourceDeps :: Verbosity -> Flag (Maybe Int) -> GlobalFlags -> IO (UseSandbox, WereDepsReinstalled) -maybeReinstallAddSourceDeps verbosity numJobsFlag globalFlags = do +maybeReinstallAddSourceDeps verbosity numJobsFlag globalFlags' = do currentDir <- getCurrentDirectory pkgEnvType <- classifyPackageEnvironment currentDir case pkgEnvType of @@ -513,14 +507,29 @@ maybeReinstallAddSourceDeps verbosity numJobsFlag globalFlags = do UserPackageEnvironment -> return (NoSandbox, NoDepsReinstalled) SandboxPackageEnvironment -> do (useSandbox, config) <- loadConfigOrSandboxConfig verbosity - (globalConfigFile globalFlags) mempty - let sandboxDir = case useSandbox of - UseSandbox d -> d; - _ -> error "Distribution.Client.Sandbox.\ - \maybeInstallAddSourceDeps: can't happen" - depsReinstalled <- reinstallAddSourceDeps verbosity config - numJobsFlag sandboxDir globalFlags - return (useSandbox, depsReinstalled) + (globalConfigFile globalFlags') mempty + case useSandbox of + UseSandbox sandboxDir -> do + let configFlags = savedConfigureFlags config + configExFlags = defaultConfigExFlags + `mappend` savedConfigureExFlags config + installFlags' = defaultInstallFlags + `mappend` savedInstallFlags config + installFlags = installFlags' { + installNumJobs = installNumJobs installFlags' + `mappend` numJobsFlag + } + globalFlags = savedGlobalFlags config + `mappend` globalFlags' + + depsReinstalled <- reinstallAddSourceDeps verbosity config + configFlags configExFlags installFlags globalFlags + sandboxDir + return (useSandbox, depsReinstalled) + + NoSandbox -> error $ + "Distribution.Client.Sandbox.maybeReinstallAddSourceDeps: " + ++ "can't happen." -- | Update the 'with-compiler' and 'package-db' fields in the auto-generated -- sandbox config file if the user has configured the project with a different diff --git a/cabal-install/Main.hs b/cabal-install/Main.hs index 940422d553d532bf1ea9ceffb3ccb3ace088fd02..f1f192f69e37511ee01b4ad9da585026ab5e7973 100644 --- a/cabal-install/Main.hs +++ b/cabal-install/Main.hs @@ -50,7 +50,7 @@ import Distribution.Client.SetupWrapper import Distribution.Client.Config ( SavedConfig(..), loadConfig, defaultConfigFile ) import Distribution.Client.Targets - ( readUserTargets ) + ( UserTarget(UserTargetLocalDir), readUserTargets ) import qualified Distribution.Client.List as List ( list, info ) @@ -81,6 +81,7 @@ import Distribution.Client.Sandbox (sandboxInit ,maybeWithSandboxDirOnSearchPath ,WereDepsReinstalled(..) ,maybeReinstallAddSourceDeps + ,reinstallAddSourceDeps ,maybeUpdateSandboxConfig ,tryGetIndexFilePath @@ -238,8 +239,8 @@ configureAction (configFlags, configExFlags) extraArgs globalFlags = do initPackageDBIfNeeded verbosity configFlags'' comp conf maybeUpdateSandboxConfig verbosity config configFlags'' - -- If we've switched to a new compiler, we need to add a timestamp record - -- for this compiler to the timestamp file. + -- If we've switched to a new compiler, we may need to add a timestamp + -- record for this compiler to the timestamp file. indexFile <- tryGetIndexFilePath config maybeAddCompilerTimestampRecord verbosity sandboxDir indexFile (compilerId comp) platform @@ -464,8 +465,8 @@ installAction (configFlags, configExFlags, installFlags, haddockFlags) globalFlags' = savedGlobalFlags config `mappend` globalFlags (comp, platform, conf) <- configCompilerAux' configFlags' - -- If this a sandbox and the user has set the -w option, we may need to create - -- a sandbox-local package DB for this compiler. + -- If we're working inside a sandbox and the user has set the -w option, we + -- may need to create a sandbox-local package DB for this compiler. let configFlags'' = case useSandbox of NoSandbox -> configFlags' (UseSandbox sandboxDir) -> setPackageDB sandboxDir @@ -473,6 +474,23 @@ installAction (configFlags, configExFlags, installFlags, haddockFlags) when (isUseSandbox useSandbox) $ initPackageDBIfNeeded verbosity configFlags'' comp conf + -- If we're working inside a sandbox and "." is among the targets, we should + -- reinstall add-source dependencies for this compiler. + whenUsingSandbox useSandbox $ \sandboxDir -> do + -- If the 'install' command was invoked with '-w', we may need to add a + -- timestamp record for this compiler to the timestamp file. + indexFile <- tryGetIndexFilePath config + maybeAddCompilerTimestampRecord verbosity sandboxDir indexFile + (compilerId comp) platform + + when (null targets || (UserTargetLocalDir ".") `elem` targets) $ do + -- 'install .' always runs 'configure', so we don't need to check whether + -- we need to reconfigure. + _ <- reinstallAddSourceDeps verbosity config configFlags'' configExFlags' + installFlags' globalFlags' + sandboxDir + return () + maybeWithSandboxDirOnSearchPath useSandbox $ install verbosity (configPackageDB' configFlags'' (maybeForceGlobalInstall useSandbox))