Merge pull request #334 from hirschenberger/develbuildghcapi

Develbuildghcapi
This commit is contained in:
Luite Stegeman 2012-04-25 08:18:29 -07:00
commit 0f06c29949
3 changed files with 43 additions and 10 deletions

View File

@ -41,7 +41,8 @@ import System.FilePath (splitDirectories, dropExtension, takeExtension
import System.Posix.Types (EpochTime) import System.Posix.Types (EpochTime)
import System.PosixCompat.Files (modificationTime, getFileStatus) import System.PosixCompat.Files (modificationTime, getFileStatus)
import System.Process (createProcess, proc, terminateProcess, readProcess, ProcessHandle, import System.Process (createProcess, proc, terminateProcess, readProcess, ProcessHandle,
getProcessExitCode,waitForProcess, rawSystem, runInteractiveProcess) getProcessExitCode,waitForProcess, rawSystem,
runInteractiveProcess, system)
import System.IO (hClose, hIsEOF, hGetLine, stdout, stderr, hPutStrLn) import System.IO (hClose, hIsEOF, hGetLine, stdout, stderr, hPutStrLn)
import System.IO.Error (isDoesNotExistError) import System.IO.Error (isDoesNotExistError)
@ -63,16 +64,18 @@ removeLock :: IO ()
removeLock = removeFileIfExists lockFile removeLock = removeFileIfExists lockFile
data DevelOpts = DevelOpts data DevelOpts = DevelOpts
{ isCabalDev :: Bool { isCabalDev :: Bool
, forceCabal :: Bool , forceCabal :: Bool
, verbose :: Bool , verbose :: Bool
, successHook :: Maybe String
, failHook :: Maybe String
} deriving (Show, Eq) } deriving (Show, Eq)
cabalCommand :: DevelOpts -> FilePath cabalCommand :: DevelOpts -> FilePath
cabalCommand opts | isCabalDev opts = "cabal-dev" cabalCommand opts | isCabalDev opts = "cabal-dev"
| otherwise = "cabal" | otherwise = "cabal"
defaultDevelOpts = DevelOpts False False False defaultDevelOpts = DevelOpts False False False Nothing Nothing
devel :: DevelOpts -> [String] -> IO () devel :: DevelOpts -> [String] -> IO ()
devel opts passThroughArgs = do devel opts passThroughArgs = do
@ -109,8 +112,11 @@ devel opts passThroughArgs = do
pkgArgs <- ghcPackageArgs opts ghcVer (D.packageDescription gpd) lib pkgArgs <- ghcPackageArgs opts ghcVer (D.packageDescription gpd) lib
let devArgs = pkgArgs ++ ["devel.hs"] ++ passThroughArgs let devArgs = pkgArgs ++ ["devel.hs"] ++ passThroughArgs
if not success if not success
then putStrLn "Build failure, pausing..." then do
putStrLn "Build failure, pausing..."
runBuildHook $ failHook opts
else do else do
runBuildHook $ successHook opts
removeLock removeLock
putStrLn $ if verbose opts then "Starting development server: runghc " ++ L.unwords devArgs putStrLn $ if verbose opts then "Starting development server: runghc " ++ L.unwords devArgs
else "Starting development server..." else "Starting development server..."
@ -127,6 +133,13 @@ devel opts passThroughArgs = do
Ex.throwTo watchTid (userError "process finished") Ex.throwTo watchTid (userError "process finished")
watchForChanges hsSourceDirs [cabal] list watchForChanges hsSourceDirs [cabal] list
runBuildHook :: Maybe String -> IO ()
runBuildHook (Just s) = do
ret <- system s
case ret of
ExitFailure f -> putStrLn $ "Error executing hook: " ++ s
otherwise -> return ()
runBuildHook Nothing = return ()
{- {-
configure with the built-in Cabal lib for non-cabal-dev, since configure with the built-in Cabal lib for non-cabal-dev, since

View File

@ -28,6 +28,22 @@ mkOptApi name = option name (\o -> o
, optionDescription = "use the GHC API to build (faster, but experimental)" , optionDescription = "use the GHC API to build (faster, but experimental)"
}) })
mkOptSuccessHook name = option name (\o -> o
{ optionLongFlags = ["success-hook"]
, optionShortFlags = ['s']
, optionType = optionTypeMaybe optionTypeString
, optionDefault = ""
, optionDescription = "Shell command to run when compilation succeeds (e.g. 'beep')"
})
mkOptFailHook name = option name (\o -> o
{ optionLongFlags = ["fail-hook"]
, optionShortFlags = ['f']
, optionType = optionTypeMaybe optionTypeString
, optionDefault = ""
, optionDescription = "Shell command to run when compilation fails (e.g. 'beep')"
})
mkOptVerbose name = option name (\o -> o mkOptVerbose name = option name (\o -> o
{ optionLongFlags = ["verbose"] { optionLongFlags = ["verbose"]
, optionShortFlags = ['v'] , optionShortFlags = ['v']

View File

@ -20,10 +20,12 @@ defineOptions "NoOptions" (return ())
defineOptions "DevelOptions" $ do defineOptions "DevelOptions" $ do
mkOptApi "develOptApi" mkOptApi "develOptApi"
-- mkOptNoApi "develOptNoApi" -- use this later when flag is enabled by default -- mkOptNoApi "develOptNoApi" -- use this later when flag is enabled by default
mkOptSuccessHook "optSuccessHook"
mkOptFailHook "optFailHook"
defineOptions "MainOptions" $ do defineOptions "MainOptions" $ do
mkOptCabalDev "optCabalDev" mkOptCabalDev "optCabalDev"
mkOptVerbose "optVerbose" mkOptVerbose "optVerbose"
type InitOptions = NoOptions type InitOptions = NoOptions
type ConfigureOptions = NoOptions type ConfigureOptions = NoOptions
@ -65,8 +67,10 @@ cmdTouch _ _ _ = touch
cmdDevel :: MainOptions -> DevelOptions -> [String] -> IO () cmdDevel :: MainOptions -> DevelOptions -> [String] -> IO ()
cmdDevel mopt opts args = devel dopts args cmdDevel mopt opts args = devel dopts args
where where
dopts = DevelOpts (optCabalDev mopt) forceCabal (optVerbose mopt) dopts = DevelOpts (optCabalDev mopt) forceCabal (optVerbose mopt) successHook failHook
forceCabal = not (develOptApi opts) successHook = optSuccessHook opts
failHook = optFailHook opts
forceCabal = not (develOptApi opts)
-- forceCabal = develOptNoApi opts -- forceCabal = develOptNoApi opts
cmdVersion :: MainOptions -> VersionOptions -> [String] -> IO () cmdVersion :: MainOptions -> VersionOptions -> [String] -> IO ()