module Development.Shake.Cabal ( getCabalDeps
, getCabalDepsV
, getCabalDepsA
, shakeVerbosityToCabalVerbosity
, platform
, showVersion
) where
import Control.Arrow
import Control.Composition
import Control.Monad
import Data.Foldable (toList)
import Data.Maybe (catMaybes)
#if __GLASGOW_HASKELL__ < 804
import Data.Semigroup
#endif
import Development.Shake as Shake
import Distribution.ModuleName
import Distribution.PackageDescription
import Distribution.PackageDescription.Parse
import Distribution.Types.CondTree
import Distribution.Types.PackageId
import Distribution.Verbosity as Distribution
import Distribution.Version
import System.Info (arch, os)
platform :: String
platform = arch ++ "-" ++ os
libraryToFiles :: Library -> [FilePath]
libraryToFiles lib = cs <> is <> ((<> ".hs") . toFilePath <$> explicitLibModules lib)
where (cs, is) = (cSources &&& includes) $ libBuildInfo lib
extract :: CondTree a b Library -> [Library]
extract (CondNode d _ []) = [d]
extract (CondNode d _ bs) = d : (g =<< bs)
where g (CondBranch _ tb fb) = join $ catMaybes [Just $ extract tb, extract <$> fb]
shakeVerbosityToCabalVerbosity :: Shake.Verbosity -> Distribution.Verbosity
shakeVerbosityToCabalVerbosity Silent = silent
shakeVerbosityToCabalVerbosity Quiet = normal
shakeVerbosityToCabalVerbosity Normal = normal
shakeVerbosityToCabalVerbosity Loud = verbose
shakeVerbosityToCabalVerbosity Chatty = verbose
shakeVerbosityToCabalVerbosity Diagnostic = deafening
getCabalDepsA :: FilePath -> Action (Version, [FilePath])
getCabalDepsA = join . (g <$> fmap shakeVerbosityToCabalVerbosity getVerbosity <*>) . pure
where g = liftIO .* getCabalDepsV
getCabalDeps :: FilePath -> IO (Version, [FilePath])
getCabalDeps = getCabalDepsV normal
getCabalDepsV :: Distribution.Verbosity -> FilePath -> IO (Version, [FilePath])
getCabalDepsV v p = do
pkg <- readGenericPackageDescription v p
let descr = packageDescription pkg
extraSrc = extraSrcFiles descr
vers = pkgVersion (package descr)
libs = toList (condLibrary pkg)
normalSrc = (libraryToFiles <=< extract) =<< libs
pure (vers, extraSrc <> normalSrc)