module BuildScript(main) where import Development.Rattle import Data.List.Extra import System.Environment import Control.Monad -- Takes as arguments a file and the number of threads to run with -- File is of the following format -- dir: directory-following-command-executes-from -- cmd (cmd is terminated by a newline if the line does not end with '\') -- ( this might need to be changed for windows) localOptions :: Int -> RattleOptions localOptions j = RattleOptions ".rattle" (Just "") "m1" True j [] [("PWD", ".")] Nothing False shcCmd :: String -> FilePath -> Run () shcCmd c d = cmd (Cwd d) ["sh", "-c", c] -- bare bones parsing toCmds :: String -> [(String, FilePath)] toCmds = f . lines where f [] = [] f xs = let (p,ys) = getCmd xs in p : f ys h [] = ([],[]) -- get cmd line h (x:xs) | isSuffixOf "\\" $ trim x = let (ls1,r) = h xs in (x:ls1,r) | otherwise = ([trim x],xs) getCmd [] = (("", "."),[]) getCmd (x:xs) = -- first get dir; then get cmd let (y, zs) = h xs in ((unlines y, getDir x), zs) getDir str = case stripPrefix "dir: " str of Nothing -> error $ "Expected line beginning with 'dir: ' got: " ++ str Just d -> d -- takes a single file as an argument and a number of threads main :: IO () main = do [file,j] <- getArgs file <- readFile file let cmds = toCmds file rattleRun (localOptions $ read j) $ forM_ cmds $ uncurry shcCmd