|
| 1 | +{-# LANGUAGE OverloadedStrings #-} |
| 2 | +{-# LANGUAGE RecordWildCards #-} |
| 3 | +{-# LANGUAGE TemplateHaskell #-} |
| 4 | +module Stack.Dot where |
| 5 | + |
| 6 | + |
| 7 | +import Control.Monad (when) |
| 8 | +import Control.Monad.Catch (MonadCatch) |
| 9 | +import Control.Monad.IO.Class (MonadIO) |
| 10 | +import Control.Monad.Logger (MonadLogger, logInfo) |
| 11 | +import Control.Monad.Reader (MonadReader) |
| 12 | +import qualified Data.Foldable as F |
| 13 | +import Data.Monoid ((<>)) |
| 14 | +import qualified Data.Map as Map |
| 15 | +import qualified Data.Set as Set |
| 16 | +import qualified Data.Text as T |
| 17 | +import Stack.Build.Source |
| 18 | +import Stack.Build.Types |
| 19 | +import Stack.Package |
| 20 | +import Stack.Types |
| 21 | + |
| 22 | +-- | Convert a package name to a graph node name. |
| 23 | +nodeName :: PackageName -> T.Text |
| 24 | +nodeName name = "\"" <> T.pack (packageNameString name) <> "\"" |
| 25 | + |
| 26 | +dot :: (MonadReader env m, HasBuildConfig env, MonadIO m, MonadLogger m, MonadCatch m,HasEnvConfig env) |
| 27 | + => m () |
| 28 | +dot = do |
| 29 | + (locals, _names, _idents) <- loadLocals |
| 30 | + BuildOpts |
| 31 | + { boptsTargets = [] |
| 32 | + , boptsLibProfile = False |
| 33 | + , boptsExeProfile = False |
| 34 | + , boptsEnableOptimizations = Nothing |
| 35 | + , boptsHaddock = False |
| 36 | + , boptsHaddockDeps = Nothing |
| 37 | + , boptsFinalAction = DoNothing |
| 38 | + , boptsDryrun = False |
| 39 | + , boptsGhcOptions = [] |
| 40 | + , boptsFlags = Map.empty |
| 41 | + , boptsInstallExes = False |
| 42 | + , boptsPreFetch = False |
| 43 | + , boptsTestArgs = [] |
| 44 | + , boptsOnlySnapshot = False |
| 45 | + , boptsCoverage = False |
| 46 | + } |
| 47 | + Map.empty |
| 48 | + let localNames = Set.fromList $ map (packageName . lpPackage) locals |
| 49 | + |
| 50 | + $logInfo "digraph deps {" |
| 51 | + $logInfo "splines=polyline;" |
| 52 | + |
| 53 | + F.forM_ locals $ \lp -> do |
| 54 | + let deps = Set.intersection localNames $ packageAllDeps $ lpPackage lp |
| 55 | + F.forM_ deps $ \dep -> |
| 56 | + $logInfo $ T.concat |
| 57 | + [ nodeName $ packageName $ lpPackage lp |
| 58 | + , " -> " |
| 59 | + , nodeName dep |
| 60 | + , ";" |
| 61 | + ] |
| 62 | + when (Set.null deps) $ |
| 63 | + $logInfo $ T.concat |
| 64 | + [ "{rank=max; " |
| 65 | + , nodeName $ packageName $ lpPackage lp |
| 66 | + , "}" |
| 67 | + ] |
| 68 | + |
| 69 | + $logInfo "}" |
0 commit comments