hackport-0.6.6: cabal/cabal-install/Distribution/Client/Exec.hs
-----------------------------------------------------------------------------
-- |
-- Module : Distribution.Client.Exec
-- Maintainer : cabal-devel@haskell.org
-- Portability : portable
--
-- Implementation of the 'exec' command. Runs an arbitrary executable in an
-- environment suitable for making use of the sandbox.
-----------------------------------------------------------------------------
module Distribution.Client.Exec ( exec
) where
import Prelude ()
import Distribution.Client.Compat.Prelude
import Distribution.Simple.Compiler (Compiler)
import Distribution.Simple.Program.Db (ProgramDb, requireProgram, modifyProgramSearchPath)
import Distribution.Simple.Program.Run (programInvocation, runProgramInvocation)
import Distribution.Simple.Program.Types ( simpleProgram, ConfiguredProgram(..) )
import Distribution.Simple.Utils (die')
import Distribution.System (Platform(..))
-- | Execute the given command in the package's environment.
--
-- The given command is executed with GHC configured to use the correct
-- package database and with the sandbox bin directory added to the PATH.
exec :: Verbosity
-> Compiler
-> Platform
-> ProgramDb
-> [String]
-> IO ()
exec verbosity _comp _platform programDb extraArgs =
case extraArgs of
(exe:args) -> do
program <- requireProgram' verbosity programDb exe
env <- environmentOverrides (programOverrideEnv program)
let invocation = programInvocation
program { programOverrideEnv = env }
args
runProgramInvocation verbosity invocation
[] -> die' verbosity "Please specify an executable to run"
where
environmentOverrides env = return env
-- | Check that a program is configured and available to be run. If
-- a sandbox is available check in the sandbox's directory.
requireProgram' :: Verbosity
-> ProgramDb
-> String
-> IO ConfiguredProgram
requireProgram' verbosity programDb exe = do
(program, _) <- requireProgram
verbosity
(simpleProgram exe)
updateSearchPath
return program
where
updateSearchPath =
flip modifyProgramSearchPath programDb $ \searchPath -> searchPath