module Ivory.Compile.C.SourceDeps where
import Control.Monad
import System.FilePath
import System.Directory
import Data.Either
import qualified Data.Set as Set
import Ivory.Language
import qualified Ivory.Language.Syntax.AST as AST
collectSourceDeps :: [Module] -> [FilePath]
collectSourceDeps ms = Set.toList $ foldl aux Set.empty ms
where aux acc m = Set.union acc (AST.modSourceDeps m)
outputSourceDeps :: FilePath -> FilePath
-> [FilePath]
-> [FilePath]
-> IO ()
outputSourceDeps inclDir srcDir srcDeps searchPath = do
validSearchPath <- filterM doesDirectoryExist searchPath
discovered <- mapM (findSource validSearchPath) srcDeps
mapM_ output (rights discovered)
case lefts discovered of
[] -> return ()
es -> error $ "failure to output source dependencies:\n" ++ (unlines es) ++
"in search path:\n" ++ (unlines searchPath)
where
findSource :: [FilePath] -> FilePath -> IO (Either String FilePath)
findSource searchpath f = do
v <- filterM doesFileExist $ map (\p -> p </> f) searchpath
case v of
[] -> return $ Left ("not found: " ++ f)
a:_ -> return $ Right a
output :: FilePath -> IO ()
output fp = case takeExtension fp of
".h" -> copyFile fp (inclDir </> (takeFileName fp))
_ -> copyFile fp (srcDir </> (takeFileName fp))