module Distribution.Simple.ShowBuildInfo (
mkBuildInfo, mkBuildInfo', mkCompilerInfo, mkComponentInfo
) where
import System.FilePath
import Distribution.Compat.Prelude
import Prelude ()
import qualified Distribution.Simple.GHC as GHC
import qualified Distribution.Simple.Program.GHC as GHC
import Distribution.PackageDescription
import Distribution.Compiler
import Distribution.Verbosity
import Distribution.Simple.Compiler (Compiler, showCompilerId, compilerFlavor)
import Distribution.Simple.Program
import Distribution.Simple.Setup
import Distribution.Simple.Utils (cabalVersion)
import Distribution.Utils.Json
import Distribution.Types.Component
import Distribution.Types.ComponentLocalBuildInfo
import Distribution.Types.LocalBuildInfo
import Distribution.Types.TargetInfo
import Distribution.Text
import Distribution.Pretty
mkBuildInfo
:: FilePath
-> PackageDescription
-> LocalBuildInfo
-> BuildFlags
-> (ConfiguredProgram, Compiler)
-> [TargetInfo]
-> ([String], Json)
mkBuildInfo wdir pkg_descr lbi _flags compilerInfo targetsToBuild = (warnings, JsonObject buildInfoFields)
where
buildInfoFields = mkBuildInfo' (uncurry mkCompilerInfo compilerInfo) componentInfos
componentInfosWithWarnings = map (mkComponentInfo wdir pkg_descr lbi . targetCLBI) targetsToBuild
componentInfos = map snd componentInfosWithWarnings
warnings = concatMap fst componentInfosWithWarnings
mkBuildInfo'
:: Json
-> [Json]
-> [(String, Json)]
mkBuildInfo' compilerInfo componentInfos =
[ "cabal-lib-version" .= JsonString (display cabalVersion)
, "compiler" .= compilerInfo
, "components" .= JsonArray componentInfos
]
mkCompilerInfo :: ConfiguredProgram -> Compiler -> Json
mkCompilerInfo compilerProgram compilerInfo = JsonObject
[ "flavour" .= JsonString (prettyShow $ compilerFlavor compilerInfo)
, "compiler-id" .= JsonString (showCompilerId compilerInfo)
, "path" .= JsonString (programPath compilerProgram)
]
mkComponentInfo :: FilePath -> PackageDescription -> LocalBuildInfo -> ComponentLocalBuildInfo -> ([String], Json)
mkComponentInfo wdir pkg_descr lbi clbi = (warnings, JsonObject $
[ "type" .= JsonString compType
, "name" .= JsonString (prettyShow name)
, "unit-id" .= JsonString (prettyShow $ componentUnitId clbi)
, "compiler-args" .= JsonArray (map JsonString compilerArgs)
, "modules" .= JsonArray (map (JsonString . display) modules)
, "src-files" .= JsonArray (map JsonString sourceFiles)
, "hs-src-dirs" .= JsonArray (map (JsonString . prettyShow) $ hsSourceDirs bi)
, "src-dir" .= JsonString (addTrailingPathSeparator wdir)
] <> cabalFile)
where
(warnings, compilerArgs) = getCompilerArgs bi lbi clbi
name = componentLocalName clbi
bi = componentBuildInfo comp
comp = fromMaybe (error $ "mkBuildInfo: no component " ++ prettyShow name) $ lookupComponent pkg_descr name
compType = case comp of
CLib _ -> "lib"
CExe _ -> "exe"
CTest _ -> "test"
CBench _ -> "bench"
CFLib _ -> "flib"
modules = case comp of
CLib lib -> explicitLibModules lib
CExe exe -> exeModules exe
CTest test ->
case testInterface test of
TestSuiteExeV10 _ _ -> []
TestSuiteLibV09 _ modName -> [modName]
TestSuiteUnsupported _ -> []
CBench bench -> benchmarkModules bench
CFLib flib -> foreignLibModules flib
sourceFiles = case comp of
CLib _ -> []
CExe exe -> [modulePath exe]
CTest test ->
case testInterface test of
TestSuiteExeV10 _ fp -> [fp]
TestSuiteLibV09 _ _ -> []
TestSuiteUnsupported _ -> []
CBench bench -> case benchmarkInterface bench of
BenchmarkExeV10 _ fp -> [fp]
BenchmarkUnsupported _ -> []
CFLib _ -> []
cabalFile
| Just fp <- pkgDescrFile lbi = [("cabal-file", JsonString fp)]
| otherwise = []
getCompilerArgs
:: BuildInfo
-> LocalBuildInfo
-> ComponentLocalBuildInfo
-> ([String], [String])
getCompilerArgs bi lbi clbi =
case compilerFlavor $ compiler lbi of
GHC -> ([], ghc)
GHCJS -> ([], ghc)
c ->
( ["ShowBuildInfo.getCompilerArgs: Don't know how to get build "
++ " arguments for compiler " ++ show c]
, [])
where
ghc = GHC.renderGhcOptions (compiler lbi) (hostPlatform lbi) baseOpts
where
baseOpts = GHC.componentGhcOptions normal lbi bi clbi (buildDir lbi)