Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

71 lines (60 sloc) 3.034 kb
-----------------------------------------------------------------------------
-- |
-- Module : Distribution.Client.Run
-- Maintainer : cabal-devel@haskell.org
-- Portability : portable
--
-- Implementation of the 'run' command.
-----------------------------------------------------------------------------
module Distribution.Client.Run ( run )
where
import Distribution.Client.Setup (BuildFlags (..))
import Distribution.Client.SetupWrapper (SetupScriptOptions (..),
defaultSetupScriptOptions)
import Distribution.PackageDescription (Executable (..),
PackageDescription (..))
import Distribution.Simple.Build.PathsModule (pkgPathEnvVar)
import Distribution.Simple.BuildPaths (exeExtension)
import Distribution.Simple.Configure (getPersistBuildConfig)
import Distribution.Simple.LocalBuildInfo (LocalBuildInfo (..))
import Distribution.Simple.Setup (fromFlagOrDefault)
import Distribution.Simple.Utils (die, rawSystemExitWithEnv)
import Distribution.Verbosity (Verbosity)
import Data.Functor ((<$>))
import Data.List (find)
import System.Directory (canonicalizePath,
getCurrentDirectory)
import System.Environment (getEnvironment)
import System.FilePath ((<.>), (</>))
run :: Verbosity -> BuildFlags -> [String] -> IO ()
run verbosity buildFlags args = do
let distPref = fromFlagOrDefault (useDistPref defaultSetupScriptOptions)
(buildDistPref buildFlags)
-- The package must have been configured by now.
lbi <- getPersistBuildConfig distPref
curDir <- getCurrentDirectory
let buildPref = buildDir lbi
pkg_descr = localPkgDescr lbi
exes = executables pkg_descr
dataDirEnvVar = (pkgPathEnvVar pkg_descr "datadir",
curDir </> dataDir pkg_descr)
exePath :: Executable -> FilePath
exePath exe = buildPref </> exeName exe </> (exeName exe <.> exeExtension)
doRun :: Executable -> [String] -> IO ()
doRun exe exeArgs = do
path <- canonicalizePath $ exePath exe
env <- (dataDirEnvVar:) <$> getEnvironment
rawSystemExitWithEnv verbosity path exeArgs env
case exes of
[] -> die "Couldn't find any executables."
[exe] -> case args of
[] -> doRun exe []
(x:xs) | x == exeName exe -> doRun exe xs
| otherwise -> doRun exe args
_ -> case args of
[] -> die $ "This package contains multiple executables. "
++ "You must pass the executable name as the first argument "
++ "to run."
(x:xs) -> case find (\exe -> exeName exe == x) exes of
Nothing -> die $ "No executable named '" ++ x ++ "'."
Just exe -> doRun exe xs
Jump to Line
Something went wrong with that request. Please try again.