module Distribution.Make (
module Distribution.Package,
License(..), Version(..),
defaultMain, defaultMainArgs, defaultMainNoRead
) where
import Distribution.Package
import Distribution.Simple.Program(defaultProgramConfiguration)
import Distribution.PackageDescription
import Distribution.Simple.Setup
import Distribution.Simple.Utils (die, maybeExit)
import Distribution.License (License(..))
import Distribution.Version (Version(..))
import Distribution.Verbosity
import System.Environment(getArgs)
import Data.List ( intersperse )
import System.Cmd
import System.Exit
exec :: String -> IO ExitCode
exec cmd = (putStrLn $ "-=-= Cabal executing: " ++ cmd ++ "=-=-")
>> system cmd
defaultMain :: IO ()
defaultMain = getArgs >>= defaultMainArgs
defaultMainArgs :: [String] -> IO ()
defaultMainArgs args =
defaultMainHelper args $ \ _verbosity ->
error "Package Descripion was promised not be used here"
defaultMainNoRead :: PackageDescription -> IO ()
defaultMainNoRead pkg_descr = do
args <- getArgs
defaultMainHelper args $ \ _ -> return pkg_descr
defaultMainHelper :: [String] -> (Verbosity -> IO PackageDescription) -> IO ()
defaultMainHelper globalArgs _get_pkg_descr
= do (action, args) <- parseGlobalArgs defaultProgramConfiguration globalArgs
case action of
ConfigCmd flags -> do
(configFlags, _, extraArgs) <- parseConfigureArgs defaultProgramConfiguration flags args []
retVal <- exec $ unwords $
"./configure" : configureArgs configFlags ++ extraArgs
if (retVal == ExitSuccess)
then putStrLn "Configure Succeeded."
else putStrLn "Configure failed."
exitWith retVal
CopyCmd copydest0 -> do
((CopyFlags copydest _), _, extraArgs) <- parseCopyArgs (CopyFlags copydest0 normal) args []
no_extra_flags extraArgs
let cmd = case copydest of
NoCopyDest -> "install"
CopyTo path -> "copy destdir=" ++ path
CopyPrefix path -> "install prefix=" ++ path
maybeExit $ system $ ("make " ++ cmd)
InstallCmd -> do
((InstallFlags _ _), _, extraArgs) <- parseInstallArgs emptyInstallFlags args []
no_extra_flags extraArgs
maybeExit $ system $ "make install"
retVal <- exec "make register"
if (retVal == ExitSuccess)
then putStrLn "Install Succeeded."
else putStrLn "Install failed."
exitWith retVal
HaddockCmd -> do
(_, _, extraArgs) <- parseHaddockArgs emptyHaddockFlags args []
no_extra_flags extraArgs
retVal <- exec "make docs"
case retVal of
ExitSuccess -> do putStrLn "Haddock Succeeded"
exitWith ExitSuccess
_ -> do retVal' <- exec "make doc"
case retVal' of
ExitSuccess -> do putStrLn "Haddock Succeeded"
exitWith ExitSuccess
_ -> do putStrLn "Haddock Failed."
exitWith retVal'
BuildCmd -> basicCommand "Build" "make"
(parseBuildArgs defaultProgramConfiguration
(emptyBuildFlags defaultProgramConfiguration)
args [])
MakefileCmd -> exitWith ExitSuccess
CleanCmd -> basicCommand "Clean" "make clean"
(parseCleanArgs emptyCleanFlags args [])
SDistCmd -> basicCommand "SDist" "make dist" (parseSDistArgs args [])
RegisterCmd -> basicCommand "Register" "make register"
(parseRegisterArgs emptyRegisterFlags args [])
UnregisterCmd -> basicCommand "Unregister" "make unregister"
(parseUnregisterArgs emptyRegisterFlags args [])
ProgramaticaCmd -> basicCommand "Programatica" "make programatica"
(parseProgramaticaArgs args [])
HelpCmd -> exitWith ExitSuccess
_ -> do putStrLn "Command not implemented for makefiles."
exitWith (ExitFailure 1)
basicCommand :: String
-> String
-> (IO (b, [a], [String]))
-> IO ()
basicCommand commandName commandCommand commandParseFun = do
(_, _, args) <- commandParseFun
no_extra_flags args
retVal <- exec commandCommand
putStrLn $ commandName ++
if (retVal == ExitSuccess)
then " Succeeded."
else " Failed."
exitWith retVal
no_extra_flags :: [String] -> IO ()
no_extra_flags [] = return ()
no_extra_flags extra_flags =
die $ "Unrecognised flags: " ++ concat (intersperse "," (extra_flags))