self-extract-0.3.0: src/Codec/SelfExtract/Distribution.hs
{-|
Module : Codec.SelfExtract.Distribution
Maintainer : Brandon Chinn <brandonchinn178@gmail.com>
Stability : experimental
Portability : portable
Defines functions that should be used in the @Setup.hs@ file.
-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module Codec.SelfExtract.Distribution
( getExe
, getExe'
) where
import Distribution.Simple.LocalBuildInfo (InstallDirs(..), LocalBuildInfo(..), fromPathTemplate)
import Distribution.Simple.Setup (ConfigFlags(..), fromFlag)
import Path (Abs, File, Path, parseAbsDir, parseRelFile, toFilePath, (</>))
-- | Get the executable with the given name with the given LocalBuildInfo.
--
-- @
-- main = defaultMainWithHooks simpleUserHooks
-- { postCopy = \args cf pd lbi -> do
-- postCopy simpleUserHooks args cf pd lbi
-- exe <- getExe lbi "name-of-executable"
-- bundle exe ".\/static\/"
-- }
-- @
getExe :: LocalBuildInfo -> String -> IO FilePath
getExe lbi exeName = toFilePath <$> getExe' lbi exeName
-- | Same as 'getExe', except using the 'Path' library.
--
-- @
-- main = defaultMainWithHooks simpleUserHooks
-- { postCopy = \args cf pd lbi -> do
-- postCopy simpleUserHooks args cf pd lbi
-- exe <- getExe' lbi "name-of-executable"
-- bundle' exe [reldir|.\/static\/|]
-- }
-- @
getExe' :: LocalBuildInfo -> String -> IO (Path Abs File)
getExe' LocalBuildInfo{configFlags} exeName = do
binDir <- parseAbsDir $ fromPathTemplate $ fromFlag $ bindir $ configInstallDirs configFlags
exe <- parseRelFile exeName
return $ binDir </> exe