module DDC.Driver.Command.BaseBuild
(cmdBaseBuild)
where
import DDC.Driver.Stage
import DDC.Build.Platform
import DDC.Build.Builder
import DDC.Driver.Command.Compile
import System.FilePath
import System.Directory
import Control.Monad.Trans.Except
import Control.Monad.IO.Class
import Control.Monad
import DDC.Build.Interface.Store (Store)
baseSaltFiles :: Builder -> [FilePath]
baseSaltFiles builder
= let bits = show $ archPointerWidth $ platformArch $ buildTarget builder
runtime = "salt" </> "runtime" ++ bits
in [ runtime </> "debug" </> "Trace.dcs"
, runtime </> "primitive" </> "Array.dcs"
, runtime </> "primitive" </> "Ref.dcs"
, runtime </> "primitive" </> "Text.dcs"
, runtime </> "Apply.dcs"
, runtime </> "Object.dcs" ]
baseSeaFiles :: Builder -> [FilePath]
baseSeaFiles _builder
= ["sea" </> "primitive" </> "Primitive.c"]
cmdBaseBuild :: Config -> Store -> ExceptT String IO ()
cmdBaseBuild config store
= do let builder = configBuilder config
let target = buildTarget builder
exists <- liftIO $ doesDirectoryExist $ buildBaseLibDir builder
when (not exists)
$ liftIO $ createDirectory $ buildBaseLibDir builder
let config' = config { configInferTypes = True }
let srcSaltFiles = map (buildBaseSrcDir builder </>) (baseSaltFiles builder)
let objSaltFiles = map (flip replaceExtension "o") srcSaltFiles
mapM_ (cmdCompile config' False store) srcSaltFiles
let srcSeaFiles = map (buildBaseSrcDir builder </>) (baseSeaFiles builder)
let objSeaFiles = map (flip replaceExtension "o") srcSeaFiles
liftIO $ zipWithM_ (buildCC builder) srcSeaFiles objSeaFiles
let objFiles = objSaltFiles ++ objSeaFiles
let staticRuntime
= buildBaseLibDir builder
</> "libddc-runtime." ++ staticFileExtensionOfPlatform target
liftIO $ buildLdLibStatic builder objFiles staticRuntime
let sharedRuntime
= buildBaseLibDir builder
</> "libddc-runtime." ++ sharedFileExtensionOfPlatform target
liftIO $ buildLdLibShared builder objFiles sharedRuntime
return ()