module DDC.Driver.Command.Build
(cmdBuild)
where
import DDC.Driver.Config
import DDC.Driver.Build.Main
import DDC.Driver.Command.Compile
import DDC.Base.Pretty
import DDC.Build.Interface.Store (Store)
import Control.Monad.Trans.Except
import Control.Monad.IO.Class
import qualified System.FilePath as FilePath
import qualified DDC.Build.Spec.Parser as Spec
import qualified DDC.Build.Builder as Builder
import qualified Data.List as List
cmdBuild :: Config -> Store -> FilePath -> ExceptT String IO ()
cmdBuild config store filePath
| ".build" <- FilePath.takeExtension filePath
= do
let config'
= config
{ configModuleBaseDirectories
= List.nub
$ configModuleBaseDirectories config
++ [ FilePath.takeDirectory filePath
, Builder.buildBaseSrcDir (configBuilder config)
FilePath.</> "tetra" FilePath.</> "base" ]
}
str <- liftIO $ readFile filePath
case Spec.parseBuildSpec filePath str of
Left err -> throwE $ renderIndent $ ppr err
Right spec -> buildSpec config' store spec
| ".ds" <- FilePath.takeExtension filePath
= do cmdCompileRecursive config False store filePath
return ()
| otherwise
= let ext = FilePath.takeExtension filePath
in throwE $ "Cannot build from '" ++ ext ++ "' files."