import Development.Shake as Shake import System.Directory import System.Process import System.Environment import Development.Shake.FilePath import Control.Monad import Data.Char import Data.List -- local repos to use; later look at the srcs to figure out what the external repo does repos :: [String] repos = [ "../sunroof-compiler" -- the sunroof compiler , "../sunroof-server" ] findExecs :: [String] -> [(String,Exec)] findExecs (xs:xss) = case words xs of ["Executable",nm] -> let loop (xs:xss) o | all isSpace xs = loop xss o | isSpace (head xs) = case words xs of ("Main-is:":ns) -> loop xss (o { the_main = unwords ns }) ("Hs-Source-Dirs:":ns) -> loop xss (o { the_dir = unwords ns }) ("Ghc-Options:":ns) -> loop xss (o { the_opts = unwords ns }) _ -> loop xss o | otherwise = (nm,o) : findExecs (xs:xss) loop [] o = (nm,o) : [] in loop xss (Exec "" "" "") _ -> findExecs xss findExecs [] = [] data Exec = Exec { the_main :: String , the_dir :: String , the_opts :: String } deriving Show main = do args <- getArgs execs <- readFile "sunroof-examples.cabal" >>= return . findExecs . lines main2 args execs main2 [] execs = do putStrLn "usage: Shake [all] exec_1 exec_2 ..." putStrLn "" putStrLn "to clean, use cabal clean" putStrLn "" putStrLn "Executables" putStrLn "-----------" putStr $ unlines [ "Executable " ++ nm ++ " (" ++ the_main exec ++ " in " ++ the_dir exec ++ " with " ++ the_opts exec ++ ")" | (nm,exec) <- execs ] -- to clean, use cabal clean main2 xs execs = shake (shakeOptions) $ do let autogen = "inplace-autogen/Paths_sunroof_examples.hs" let targets = [ "dist" "build" nm nm | (nm,ex) <- execs , xs == ["all" ]|| nm `elem` xs ] want [autogen] want targets autogen *> \ out -> do pwd <- liftIO $ getCurrentDirectory writeFile' out $ unlines [ "module Paths_sunroof_examples where" , "getDataDir :: IO String" , "getDataDir = return " ++ show pwd ] targets **> \ out -> do liftIO $ print out let nm = takeFileName out liftIO $ print nm let Just exec = lookup nm execs liftIO $ print exec need [ the_dir exec the_main exec] sequence_ [ do files <- getDirectoryFiles repo ["*.cabal"] liftIO $ print files need $ map (repo ) files files <- getDirectoryFiles repo ["//*.hs"] liftIO $ print files need $ map (repo ) files | repo <- repos ] liftIO $ putStrLn $ "Building: " ++ out -- compile inside the build dir let cache = takeDirectory out "cache" systemCwd "." "ghc" ["--make",the_dir exec the_main exec, the_opts exec, "-hidir",cache,"-odir",cache, "-dcore-lint", "-o", out, "-i" ++ concat (intersperse ":" (the_dir exec : "inplace-autogen" : repos)) ]