module Control.Distributed.Task.TaskSpawning.DeployObjectCodeRelinked (
loadObjectCode, deployAndRunObjectCodeRelinked
) where
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Char8 as BLC
import Data.List (intersperse)
import System.IO.Temp (withSystemTempDirectory)
import Control.Distributed.Task.TaskSpawning.DeployFullBinary
import Control.Distributed.Task.TaskSpawning.ExecutionUtil
import Control.Distributed.Task.Util.Configuration
import Control.Distributed.Task.Util.Logging
loadObjectCode :: IO BL.ByteString
loadObjectCode = do
config <- getConfiguration
BL.readFile (_objectCodePathOnMaster config ++ "/RemoteExecutable.o")
deployAndRunObjectCodeRelinked :: BLC.ByteString -> IOHandling -> IO ExternalExecutionResult
deployAndRunObjectCodeRelinked objectCode ioHandling =
withSystemTempDirectory "object-code-build-dir" $ \builddir ->
let objectCodeFilePath = builddir ++ "/RemoteExecutable.o"
binaryPath = builddir++"/binary"
in do
logInfo "slave: preparing alternative main object code"
config <- getConfiguration
libs <- readFile "etc/remotelibs" >>= return . lines
_ <- executeExternal "ghc"
[
"-no-link",
"-outputdir", builddir,
"-package-db", _packageDbPath config,
"-i"++(_objectCodeResourcesPathSrc config),
"Control.Distributed.Task.TaskSpawning.DeployFullBinary",
"Control.Distributed.Task.Types.TaskTypes",
"-i"++(_objectCodeResourcesPathExtra config),
"RemoteExecutable",
(_objectCodeResourcesPathExtra config)++"/RemoteExecutor.hs"
]
logInfo $ "slave: prepared frame in "++builddir
logInfo "slave: storing transported object code"
BL.writeFile objectCodeFilePath objectCode
logInfo $ "slave: linking: " ++ binaryPath
_ <- executeExternal "ghc"
([
"-o", binaryPath,
builddir++"/Main.o",
objectCodeFilePath,
"-package-db", _packageDbPath config
]
++ (map ((builddir++"/")++) taskDistributionDeps)
++ (asPackageOpts libs)
)
logInfo $ "slave: running " ++ binaryPath
res <- runExternalBinary [] ioHandling binaryPath
logInfo $ "executing task finished"
logInfo $ "results: "++show res
return res
where
taskDistributionDeps = [
"Control/Distributed/Task/DataAccess/DataSource.o",
"Control/Distributed/Task/DataAccess/HdfsDataSource.o",
"Control/Distributed/Task/DataAccess/SimpleDataSource.o",
"Control/Distributed/Task/TaskSpawning/DeployFullBinary.o",
"Control/Distributed/Task/TaskSpawning/ExecutionUtil.o",
"Control/Distributed/Task/TaskSpawning/TaskDescription.o",
"Control/Distributed/Task/TaskSpawning/TaskDefinition.o",
"Control/Distributed/Task/TaskSpawning/TaskSpawningTypes.o",
"Control/Distributed/Task/Types/TaskTypes.o",
"Control/Distributed/Task/Util/Logging.o",
"Control/Distributed/Task/Util/Configuration.o",
"Control/Distributed/Task/Util/ErrorHandling.o",
"Control/Distributed/Task/Util/FileUtil.o"
]
asPackageOpts = ("-package":) . (intersperse "-package")