diff --git a/Language/Haskell/GhcMod/CabalHelper.hs b/Language/Haskell/GhcMod/CabalHelper.hs index 78e1d7c..fac9d1a 100644 --- a/Language/Haskell/GhcMod/CabalHelper.hs +++ b/Language/Haskell/GhcMod/CabalHelper.hs @@ -169,9 +169,7 @@ withCabal action = do Nothing -> return False - cusPkgStack <- maybe [] ((PackageDb "clear"):) <$> getCustomPkgDbStack - - --TODO: also invalidate when sandboxConfig file changed + projType <- cradleProjectType <$> cradle when (isSetupConfigOutOfDate mCabalFile mCabalConfig) $ gmLog GmDebug "" $ strDoc $ "setup configuration is out of date, reconfiguring Cabal project." @@ -185,20 +183,34 @@ withCabal action = do when ( isSetupConfigOutOfDate mCabalFile mCabalConfig || pkgDbStackOutOfSync || isSetupConfigOutOfDate mCabalSandboxConfig mCabalConfig) $ - withDirectory_ (cradleRootDir crdl) $ do - let progOpts = - [ "--with-ghc=" ++ T.ghcProgram opts ] - -- Only pass ghc-pkg if it was actually set otherwise we - -- might break cabal's guessing logic - ++ if T.ghcPkgProgram opts /= T.ghcPkgProgram defaultOptions - then [ "--with-ghc-pkg=" ++ T.ghcPkgProgram opts ] - else [] - ++ map pkgDbArg cusPkgStack - liftIO $ void $ readProc (T.cabalProgram opts) ("configure":progOpts) "" - gmLog GmDebug "" $ strDoc $ "writing Cabal autogen files" - liftIO $ writeAutogenFiles readProc projdir distdir + case projType of + CabalProject -> + cabalReconfigure readProc opts crdl projdir distdir + StackProject -> + -- https://github.com/commercialhaskell/stack/issues/820 + gmLog GmWarning "" $ strDoc $ "Stack project configuration is out of date, please reconfigure manually using 'stack build'" + _ -> + error $ "withCabal: unsupported project type: " ++ show projType + action + where + cabalReconfigure readProc opts crdl projdir distdir = do + withDirectory_ (cradleRootDir crdl) $ do + cusPkgStack <- maybe [] ((PackageDb "clear"):) <$> getCustomPkgDbStack + let progOpts = + [ "--with-ghc=" ++ T.ghcProgram opts ] + -- Only pass ghc-pkg if it was actually set otherwise we + -- might break cabal's guessing logic + ++ if T.ghcPkgProgram opts /= T.ghcPkgProgram defaultOptions + then [ "--with-ghc-pkg=" ++ T.ghcPkgProgram opts ] + else [] + ++ map pkgDbArg cusPkgStack + liftIO $ void $ readProc (T.cabalProgram opts) ("configure":progOpts) "" + gmLog GmDebug "" $ strDoc $ "writing Cabal autogen files" + liftIO $ writeAutogenFiles readProc projdir distdir + + pkgDbArg :: GhcPkgDb -> String pkgDbArg GlobalDb = "--package-db=global" pkgDbArg UserDb = "--package-db=user" diff --git a/Language/Haskell/GhcMod/Target.hs b/Language/Haskell/GhcMod/Target.hs index be5433e..2a23fc9 100644 --- a/Language/Haskell/GhcMod/Target.hs +++ b/Language/Haskell/GhcMod/Target.hs @@ -149,7 +149,7 @@ targetGhcOptions crdl sefnmn = do case cradleProjectType crdl of CabalProject -> cabalOpts crdl - StackProject -> stackOpts crdl + StackProject -> cabalOpts crdl _ -> sandboxOpts crdl where zipMap f l = l `zip` (f `map` l) @@ -266,17 +266,9 @@ packageGhcOptions = do crdl <- cradle case cradleProjectType crdl of CabalProject -> getGhcMergedPkgOptions - StackProject -> stackOpts crdl + StackProject -> getGhcMergedPkgOptions _ -> sandboxOpts crdl -stackOpts :: MonadIO m => Cradle -> m [String] -stackOpts crdl = do - pkgDbStack <- liftIO getStackPackageDbStack - let pkgOpts = ghcDbStackOpts pkgDbStack - return $ ["-i" ++ d | d <- [wdir,rdir]] ++ pkgOpts ++ ["-Wall"] - where - (wdir, rdir) = (cradleCurrentDir crdl, cradleRootDir crdl) - -- also works for plain projects! sandboxOpts :: MonadIO m => Cradle -> m [String] sandboxOpts crdl = do