@@ -33,7 +33,6 @@ import qualified Data.Conduit.List as CL
3333import Data.Function
3434import Data.List
3535import Data.Map.Strict (Map )
36- import qualified Data.Map.Strict as M
3736import qualified Data.Map.Strict as Map
3837import Data.Maybe
3938import Data.Set (Set )
@@ -51,7 +50,9 @@ import Path
5150import Path.IO
5251import Prelude hiding (FilePath , writeFile )
5352import Stack.Build.Cache
53+ import Stack.Build.Haddock
5454import Stack.Build.Installed
55+ import Stack.Build.Source
5556import Stack.Build.Types
5657import Stack.Fetch as Fetch
5758import Stack.GhcPkg
@@ -176,6 +177,8 @@ data ExecuteEnv = ExecuteEnv
176177 , eeTotalWanted :: ! Int
177178 , eeWanted :: ! (Set PackageName )
178179 , eeLocals :: ! [LocalPackage ]
180+ , eeSourceMap :: ! SourceMap
181+ , eeGlobalDB :: ! (Path Abs Dir )
179182 }
180183
181184-- | Perform the actual plan
@@ -184,17 +187,19 @@ executePlan :: M env m
184187 -> BuildOpts
185188 -> BaseConfigOpts
186189 -> [LocalPackage ]
190+ -> SourceMap
187191 -> Plan
188192 -> m ()
189- executePlan menv bopts baseConfigOpts locals plan = do
193+ executePlan menv bopts baseConfigOpts locals sourceMap plan = do
190194 withSystemTempDirectory stackProgName $ \ tmpdir -> do
191195 tmpdir' <- parseAbsDir tmpdir
192196 configLock <- newMVar ()
193197 installLock <- newMVar ()
194- idMap <- liftIO $ newTVarIO M . empty
198+ idMap <- liftIO $ newTVarIO Map . empty
195199 let setupHs = tmpdir' </> $ (mkRelFile " Setup.hs" )
196200 liftIO $ writeFile (toFilePath setupHs) " import Distribution.Simple\n main = defaultMain"
197201 cabalPkgVer <- asks (envConfigCabalVersion . getEnvConfig)
202+ globalDB <- getGlobalDB menv
198203 executePlan' plan ExecuteEnv
199204 { eeEnvOverride = menv
200205 , eeBuildOpts = bopts
@@ -212,6 +217,8 @@ executePlan menv bopts baseConfigOpts locals plan = do
212217 , eeTotalWanted = length $ filter lpWanted locals
213218 , eeWanted = wantedLocalPackages locals
214219 , eeLocals = locals
220+ , eeSourceMap = sourceMap
221+ , eeGlobalDB = globalDB
215222 }
216223
217224 unless (Map. null $ planInstallExes plan) $ do
@@ -335,7 +342,7 @@ executePlan' plan ee@ExecuteEnv {..} = do
335342 else return ()
336343 unless (null errs) $ throwM $ ExecutionFailure errs
337344 when (boptsHaddock eeBuildOpts && not (null actions))
338- (generateHaddockIndex ee )
345+ (generateHaddockIndex eeEnvOverride eeBaseConfigOpts eeLocals )
339346
340347toActions :: M env m
341348 => (m () -> IO () )
@@ -425,7 +432,7 @@ ensureConfig pkgDir ExecuteEnv {..} Task {..} announce cabal cabalfp extra = do
425432 TTLocal lp -> Set. map encodeUtf8 $ lpComponents lp
426433 TTUpstream _ _ -> Set. empty
427434 , configCacheHaddock =
428- shouldBuildHaddock eeBuildOpts eeWanted (packageIdentifierName taskProvides)
435+ shouldHaddockPackage eeBuildOpts eeWanted (packageIdentifierName taskProvides)
429436 }
430437
431438 let needConfig = mOldConfigCache /= Just newConfigCache
@@ -479,7 +486,7 @@ withSingleContext ActionContext {..} ExecuteEnv {..} task@Task {..} inner0 =
479486 TTUpstream package _ -> do
480487 mdist <- liftM Just distRelativeDir
481488 m <- unpackPackageIdents eeEnvOverride eeTempDir mdist $ Set. singleton taskProvides
482- case M . toList m of
489+ case Map . toList m of
483490 [(ident, dir)]
484491 | ident == taskProvides -> do
485492 let name = packageIdentifierName taskProvides
@@ -606,13 +613,14 @@ singleBuild ac@ActionContext {..} ee@ExecuteEnv {..} task@Task {..} =
606613 TTLocal lp -> " build" : map T. unpack (Set. toList $ lpComponents lp)
607614 TTUpstream _ _ -> [" build" ]
608615
609- when (shouldBuildHaddock eeBuildOpts eeWanted (packageName package) &&
610- -- Works around haddock failing on bytestring-builder since it has no modules when
611- -- bytestring is new enough.
612- packageHasExposedModules package) $ do
616+ let doHaddock = shouldHaddockPackage eeBuildOpts eeWanted (packageName package) &&
617+ -- Works around haddock failing on bytestring-builder since it has no modules
618+ -- when bytestring is new enough.
619+ packageHasExposedModules package
620+ when doHaddock $ do
613621 announce " haddock"
614622 hscolourExists <- doesExecutableExist eeEnvOverride " hscolour"
615- cabal False (concat [[" haddock" , " --html" , " --hoogle" ]
623+ cabal False (concat [[" haddock" , " --html" , " --hoogle" , " --html-location=../$pkg-$version/ " ]
616624 ,[" --hyperlink-source" | hscolourExists]])
617625
618626 withMVar eeInstallLock $ \ () -> do
@@ -638,6 +646,13 @@ singleBuild ac@ActionContext {..} ee@ExecuteEnv {..} task@Task {..} =
638646 writeFlagCache mpkgid' cache
639647 liftIO $ atomically $ modifyTVar eeGhcPkgIds $ Map. insert taskProvides mpkgid'
640648
649+ when (doHaddock && shouldHaddockDeps eeBuildOpts) $
650+ copyDepHaddocks
651+ eeEnvOverride
652+ (pkgDbs ++ [eeGlobalDB])
653+ (PackageIdentifier (packageName package) (packageVersion package))
654+ Set. empty
655+
641656singleTest :: M env m
642657 => ActionContext
643658 -> ExecuteEnv
@@ -703,8 +718,8 @@ singleTest ac ee task =
703718 liftIO $ hClose inH
704719 ec <- liftIO $ waitForProcess ph
705720 return $ case ec of
706- ExitSuccess -> M . empty
707- _ -> M . singleton testName $ Just ec
721+ ExitSuccess -> Map . empty
722+ _ -> Map . singleton testName $ Just ec
708723 else do
709724 $ logError $ T. concat
710725 [ " Test suite "
@@ -742,36 +757,6 @@ singleBench ac ee task =
742757 announce " benchmarks"
743758 cabal False [" bench" ]
744759
745- -- | Generate Haddock index and contents for local packages.
746- generateHaddockIndex :: M env m
747- => ExecuteEnv
748- -> m ()
749- generateHaddockIndex ExecuteEnv {.. } = do
750- $ logInfo (" Generating Haddock index/contents in\n " <>
751- T. pack (toFilePath (docDir </> $ (mkRelFile " index.html" ))))
752- interfaceArgs <- mapM (\ LocalPackage {lpPackage = Package {.. }} ->
753- toInterfaceOpt (PackageIdentifier packageName packageVersion))
754- eeLocals
755- readProcessNull
756- (Just docDir)
757- eeEnvOverride
758- " haddock"
759- ([" --gen-contents" , " --gen-index" ] ++ concat interfaceArgs)
760- where
761- docDir = bcoLocalInstallRoot eeBaseConfigOpts </> docdirSuffix
762- toInterfaceOpt pid@ (PackageIdentifier name _) = do
763- interfaceRelFile <- parseRelFile (packageIdentifierString pid FP. </>
764- packageNameString name FP. <.>
765- " haddock" )
766- interfaceExists <- fileExists (docDir </> interfaceRelFile)
767- return $ if interfaceExists
768- then [ " -i"
769- , concat
770- [ packageIdentifierString pid
771- , " ,"
772- , toFilePath interfaceRelFile ] ]
773- else []
774-
775760-- | Grab all output from the given @Handle@ and print it to stdout, stripping
776761-- Template Haskell "Loading package" lines. Does work in a separate thread.
777762printBuildOutput :: (MonadIO m , MonadBaseControl IO m , MonadLogger m )
0 commit comments