stack-2.13.1: src/Stack/Types/CompilerPaths.hs
{-# LANGUAGE NoImplicitPrelude #-}
module Stack.Types.CompilerPaths
( CompilerPaths (..)
, GhcPkgExe (..)
, HasCompiler (..)
, cabalVersionL
, compilerVersionL
, cpWhich
, getCompilerPath
, getGhcPkgExe
) where
import Distribution.System ( Arch )
import Stack.Prelude
import Stack.Types.Compiler
( ActualCompiler, WhichCompiler, whichCompiler )
import Stack.Types.CompilerBuild ( CompilerBuild )
import Stack.Types.DumpPackage ( DumpPackage )
-- | Paths on the filesystem for the compiler we're using
data CompilerPaths = CompilerPaths
{ cpCompilerVersion :: !ActualCompiler
, cpArch :: !Arch
, cpBuild :: !CompilerBuild
, cpCompiler :: !(Path Abs File)
, cpPkg :: !GhcPkgExe
-- ^ ghc-pkg or equivalent
, cpInterpreter :: !(Path Abs File)
-- ^ runghc
, cpHaddock :: !(Path Abs File)
-- ^ haddock, in 'IO' to allow deferring the lookup
, cpSandboxed :: !Bool
-- ^ Is this a Stack-sandboxed installation?
, cpCabalVersion :: !Version
-- ^ This is the version of Cabal that Stack will use to compile Setup.hs
-- files in the build process.
--
-- Note that this is not necessarily the same version as the one that Stack
-- depends on as a library and which is displayed when running
-- @stack ls dependencies | grep Cabal@ in the Stack project.
, cpGlobalDB :: !(Path Abs Dir)
-- ^ Global package database
, cpGhcInfo :: !ByteString
-- ^ Output of @ghc --info@
, cpGlobalDump :: !(Map PackageName DumpPackage)
}
deriving Show
-- | An environment which ensures that the given compiler is available on the
-- PATH
class HasCompiler env where
compilerPathsL :: SimpleGetter env CompilerPaths
instance HasCompiler CompilerPaths where
compilerPathsL = id
-- | Location of the ghc-pkg executable
newtype GhcPkgExe
= GhcPkgExe (Path Abs File)
deriving Show
cabalVersionL :: HasCompiler env => SimpleGetter env Version
cabalVersionL = compilerPathsL.to cpCabalVersion
compilerVersionL :: HasCompiler env => SimpleGetter env ActualCompiler
compilerVersionL = compilerPathsL.to cpCompilerVersion
cpWhich :: (MonadReader env m, HasCompiler env) => m WhichCompiler
cpWhich = view $ compilerPathsL.to (whichCompiler.cpCompilerVersion)
-- | Get the path for the given compiler ignoring any local binaries.
--
-- https://github.com/commercialhaskell/stack/issues/1052
getCompilerPath :: HasCompiler env => RIO env (Path Abs File)
getCompilerPath = view $ compilerPathsL.to cpCompiler
-- | Get the 'GhcPkgExe' from a 'HasCompiler' environment
getGhcPkgExe :: HasCompiler env => RIO env GhcPkgExe
getGhcPkgExe = view $ compilerPathsL.to cpPkg