module HSInstall.Build ( BuildTool , clean , determineBuildTool , installBinaries , makeCabal ) where import System.Directory ( getDirectoryContents ) import System.Process ( callProcess ) import HSInstall.Common ( ExeFile (..) ) import HSInstall.Except ( justDoIt ) import HSInstall.Opts ( BuildMode (AppImageExe, Project) ) data BuildTool = Cabal | Stack instance Show BuildTool where show Cabal = "cabal" show Stack = "stack" determineBuildTool :: IO BuildTool determineBuildTool = do dirContents <- getDirectoryContents "." pure $ if "stack.yaml" `elem` dirContents then Stack else Cabal clean :: BuildTool -> IO () clean Cabal = callProcess "cabal" ["v2-clean"] clean Stack = callProcess "stack" ["clean"] modeToStackArg :: BuildMode -> String modeToStackArg (AppImageExe (ExeFile exeFp)) = ':' : exeFp modeToStackArg Project = "" installBinaries :: BuildTool -> BuildMode -> FilePath -> IO () installBinaries Cabal _ binDir = callProcess "cabal" [ "v2-install" , "--install-method=copy" , "--overwrite-policy=always" , "--installdir=" ++ binDir ] installBinaries Stack mode binDir = callProcess "stack" [ "install" , modeToStackArg mode , "--local-bin-path=" ++ binDir ] makeCabal :: BuildTool -> IO () makeCabal Cabal = justDoIt $ callProcess "hpack" [] makeCabal Stack = justDoIt $ callProcess "stack" ["query"]