{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wno-deprecations #-}
{-# OPTIONS_HADDOCK show-extensions #-}
module Distribution.Simple.Toolkit
(
userHooksWithBuildInfo
, simpleUserHooksWithBuildInfo
, defaultMainWithBuildInfo
, packageDescriptionQ
, packageDescriptionTypedQ
, localBuildInfoQ
, localBuildInfoTypedQ
, getComponentInstallDirs
, getComponentBuildInfo
, getGHCLibDir
, runLBIProgram
, getLBIProgramOutput
) where
import Data.Binary
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Unsafe as BS
import Data.Map
import Distribution.Simple
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Program
import Distribution.Simple.Setup
import Distribution.Types.BuildInfo
import Distribution.Types.PackageDescription
import Distribution.Verbosity
import Language.Haskell.TH.Syntax
import System.IO.Unsafe
userHooksWithBuildInfo :: UserHooks -> UserHooks
userHooksWithBuildInfo hooks =
hooks
{ postConf =
\args flags pkg_descr lbi -> do
encodeFile ".pkg_descr.buildinfo" pkg_descr
encodeFile ".lbi.buildinfo" lbi
postConf hooks args flags pkg_descr lbi
}
simpleUserHooksWithBuildInfo :: UserHooks
simpleUserHooksWithBuildInfo = userHooksWithBuildInfo simpleUserHooks
defaultMainWithBuildInfo :: IO ()
defaultMainWithBuildInfo = defaultMainWithHooks simpleUserHooksWithBuildInfo
syringe :: FilePath -> Q Type -> Q Exp
syringe p t = do
buf <- runIO $ LBS.readFile p
[|unsafePerformIO $ do
bs <-
BS.unsafePackAddressLen
$(lift $ LBS.length buf)
$(pure $ LitE $ StringPrimL $ LBS.unpack buf)
pure ((decode $ LBS.fromStrict bs) :: $(t))|]
packageDescriptionQ :: Q Exp
packageDescriptionQ = syringe ".pkg_descr.buildinfo" [t|PackageDescription|]
packageDescriptionTypedQ :: Q (TExp PackageDescription)
packageDescriptionTypedQ = unsafeTExpCoerce packageDescriptionQ
localBuildInfoQ :: Q Exp
localBuildInfoQ = syringe ".lbi.buildinfo" [t|LocalBuildInfo|]
localBuildInfoTypedQ :: Q (TExp LocalBuildInfo)
localBuildInfoTypedQ = unsafeTExpCoerce localBuildInfoQ
getComponentInstallDirs ::
PackageDescription
-> LocalBuildInfo
-> ComponentName
-> InstallDirs FilePath
getComponentInstallDirs pkg_descr lbi k =
absoluteComponentInstallDirs
pkg_descr
lbi
(componentUnitId $ getComponentLocalBuildInfo lbi k)
NoCopyDest
getComponentBuildInfo :: PackageDescription -> ComponentName -> BuildInfo
getComponentBuildInfo pkg_descr k =
componentBuildInfo $ getComponent pkg_descr k
getGHCLibDir :: LocalBuildInfo -> FilePath
getGHCLibDir lbi = compilerProperties (compiler lbi) ! "LibDir"
runLBIProgram :: LocalBuildInfo -> Program -> [ProgArg] -> IO ()
runLBIProgram lbi prog =
runDbProgram
(fromFlagOrDefault normal $ configVerbosity $ configFlags lbi)
prog
(withPrograms lbi)
getLBIProgramOutput :: LocalBuildInfo -> Program -> [ProgArg] -> IO String
getLBIProgramOutput lbi prog =
getDbProgramOutput
(fromFlagOrDefault normal $ configVerbosity $ configFlags lbi)
prog
(withPrograms lbi)