{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
#if __GLASGOW_HASKELL__ <= 784
import Control.Applicative
#endif
import qualified Codec.Archive.Tar as Tar
import Codec.Compression.GZip (decompress)
import Control.Concurrent.ParallelIO.Global
import Control.Monad (unless, when)
import Data.List
import Distribution.Simple
import Distribution.Simple.Setup
import Distribution.Types.GenericPackageDescription
import Distribution.Types.HookedBuildInfo
import Distribution.Types.LocalBuildInfo
import Distribution.Types.PackageDescription
import Network.HTTP.Client hiding (decompress)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import System.Directory
main = defaultMainWithHooks myHooks
where myHooks = simpleUserHooks { preConf = buildScript
, postBuild = maybeCleanATS }
maybeCleanATS :: Args -> BuildFlags -> PackageDescription -> LocalBuildInfo -> IO ()
maybeCleanATS _ _ _ li =
let cf = configConfigurationsFlags (configFlags li) in
unless ((mkFlagName "development", True) `elem` cf) $
putStrLn "Cleaning up ATS dependencies..." >>
cleanATS
cleanATS :: IO ()
cleanATS = removeDirectoryRecursive "ats-deps"
buildScript :: Args -> ConfigFlags -> IO HookedBuildInfo
buildScript _ _ = do
putStrLn "Setting up ATS dependencies..."
let libs = zipWith4 buildHelper
["ats2-postiats-0.3.8-prelude", "atscntrb-hs-intinf-1.0.6", "atscntrb-libgmp-1.0.4"]
["ats-deps/prelude", "ats-deps/contrib/atscntrb-hx-intinf", "ats-deps/contrib/atscntrb-libgmp"]
["ats-deps/prelude/ATS2-Postiats-include-0.3.8/prelude", "ats-deps/contrib/atscntrb-hx-intinf", "ats-deps/contrib/atscntrb-libgmp/SATS"]
["https://downloads.sourceforge.net/project/ats2-lang/ats2-lang/ats2-postiats-0.3.8/ATS2-Postiats-include-0.3.8.tgz", "https://registry.npmjs.org/atscntrb-hx-intinf/-/atscntrb-hx-intinf-1.0.6.tgz", "https://registry.npmjs.org/atscntrb-libgmp/-/atscntrb-libgmp-1.0.4.tgz" ]
parallel_ libs >> stopGlobalPool
pure emptyHookedBuildInfo
buildHelper libName dirName needed url = do
-- FIXME not discerning enough!
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"
removeDirectory dirName
renameDirectory "tempdir" dirName