module HsDev.Tools.Ghc.System (
BuildInfo(..), buildInfo,
examineCompilerVersion,
formatBuildPath, buildPath
) where
import Control.Arrow
import qualified Data.Map as M
import Data.Maybe
import Distribution.Text (display)
import Distribution.System (buildOS)
import qualified System.Info as Sys
import Text.Format
import DynFlags (DynFlags)
import PackageConfig as GHC
import GHC (getSessionDynFlags)
import HsDev.Tools.Ghc.Compat as Compat
import HsDev.Tools.Ghc.Worker (GhcM)
data BuildInfo = BuildInfo {
targetArch :: String,
targetOS :: String,
cabalOS :: String,
compilerName :: String,
compilerVersion :: String }
buildInfo :: DynFlags -> BuildInfo
buildInfo = BuildInfo Sys.arch Sys.os (display buildOS) Sys.compilerName . examineCompilerVersion
examineCompilerVersion :: DynFlags -> String
examineCompilerVersion =
display .
fromMaybe Sys.compilerVersion .
M.lookup Sys.compilerName .
M.fromList .
map (GHC.packageNameString &&& GHC.packageVersion) .
fromMaybe [] . Compat.pkgDatabase
formatBuildPath :: String -> BuildInfo -> String
formatBuildPath f = formats f . toArgs where
toArgs b = [
"arch" ~% targetArch b,
"os" ~% targetOS b,
"os/cabal" ~% cabalOS b,
"compiler" ~% compilerName b,
"version" ~% compilerVersion b]
buildPath :: String -> GhcM FilePath
buildPath f = fmap (formatBuildPath f . buildInfo) getSessionDynFlags