module Language.ATS.Package.Dependency ( fetchDeps
, fetchFastArithmeticDeps
) where
import qualified Codec.Archive.Tar as Tar
import Codec.Compression.GZip (decompress)
import Control.Concurrent.ParallelIO.Global
import Control.Monad
import Network.HTTP.Client hiding (decompress)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import System.Directory
data Dependency = Dependency String FilePath String
atsPrelude :: Dependency
atsPrelude = Dependency "ats2-postiats-0.3.8-prelude" ".atspkg/prelude" "https://downloads.sourceforge.net/project/ats2-lang/ats2-lang/ats2-postiats-0.3.8/ATS2-Postiats-include-0.3.8.tgz"
atsIntinf :: Dependency
atsIntinf = Dependency "atscntrb-hs-intinf-1.0.6" ".atspkg/contrib/atscntrb-hx-intinf" "https://registry.npmjs.org/atscntrb-hx-intinf/-/atscntrb-hx-intinf-1.0.6.tgz"
atsGMP :: Dependency
atsGMP = Dependency "atscntrb-libgmp-1.0.4" ".atspkg/contrib/atscntrb-libgmp" "https://registry.npmjs.org/atscntrb-libgmp/-/atscntrb-libgmp-1.0.4.tgz"
fetchFastArithmeticDeps :: IO ()
fetchFastArithmeticDeps = fetchDeps [atsPrelude, atsIntinf, atsGMP]
fetchDeps :: [Dependency] -> IO ()
fetchDeps deps = do
putStrLn "Setting up ATS dependencies..."
let libs = fmap buildHelper deps
parallel_ libs >> stopGlobalPool
buildHelper :: Dependency -> IO ()
buildHelper (Dependency libName dirName url) = do
needsSetup <- not <$> doesDirectoryExist dirName
when needsSetup $ do
putStrLn ("Fetching library " ++ libName ++ "...")
manager <- newManager tlsManagerSettings
initialRequest <- parseRequest url
response <- responseBody <$> httpLbs (initialRequest { method = "GET" }) manager
putStrLn ("Unpacking library " ++ libName ++ "...")
Tar.unpack dirName . Tar.read . decompress $ response
putStrLn ("Setting up library " ++ libName ++ "...")
needsMove <- doesDirectoryExist (dirName ++ "/package")
when needsMove $ do
renameDirectory (dirName ++ "/package") "tempdir"
removeDirectoryRecursive dirName
renameDirectory "tempdir" dirName