{-# LANGUAGE TemplateHaskell #-} module RTS ( RtsInfo(..), deployRts ) where import Data.FileEmbed (embedFile) import System.IO.Temp (createTempDirectory) import System.FilePath ( () ) import qualified Codec.Archive.Tar as Tar import qualified Codec.Compression.GZip as GZip import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS -- | A tarball with a relocatable package-db, containing the rts. -- File "embedded-rts.tgz" is automatically created by the build system. rts_tarball :: BS.ByteString rts_tarball = $(embedFile "embedded-rts.tgz") data RtsInfo = RtsInfo { rtsPackageDb :: FilePath, rtsPackage :: String } -- | Extracts the embedded rts-package to a temporary directory -- inside the given directory, and returns its location. deployRts :: FilePath -> IO RtsInfo deployRts dir = do deployDir <- createTempDirectory dir "rts." extractTarball (LBS.fromStrict rts_tarball) deployDir return RtsInfo { rtsPackageDb = deployDir "embedded-rts" "pkgdb" , rtsPackage = "ide-backend-rts" } extractTarball :: LBS.ByteString -> FilePath -> IO () extractTarball tarball dest = Tar.unpack dest $ Tar.read $ GZip.decompress $ tarball