ivory-backend-c-0.1.0.0: src/Ivory/Compile/C/SourceDeps.hs
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
-- At some point we may want to restrict this to .c and .h files only
-- but for now we'll leave it alone.
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 -- Output dirs: include dir, source dir
-> [FilePath] -- SourceDeps: list if filenames to output
-> [FilePath] -- Search Path: list of directories
-> IO () -- where SourceDeps may be
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))