hsinstall-2.7: src/app/hsinstall.hs
{-# LANGUAGE OverloadedStrings #-}
import Control.Monad ( when )
import Control.Newtype.Generics ( op )
import qualified System.Directory as Dir
import System.Exit ( exitSuccess )
import System.FilePath ( (</>) )
import System.IO ( BufferMode (NoBuffering),
hSetBuffering, stderr, stdout )
import Text.Printf ( printf )
import HSInstall.AppImage ( mkAppImage, prepAppImageFiles )
import HSInstall.Build ( BuildTool, clean,
determineBuildTool, installBinaries )
import HSInstall.Common ( TmplDir (..), dumpStockIcon, tmplDir )
import HSInstall.DeploymentInfo
( BinDir (..)
, DeploymentInfo (binDir, docDir, prefixDir)
, DocDir (..)
, PrefixDir (..)
, constructDeploymentInfo
)
import HSInstall.Except ( withExceptionHandling )
import HSInstall.Opts
( BuildMode (AppImageExe, Project)
, CleanSwitch (..), DumpIconSwitch (..)
, Options (..)
, parseOpts
)
import HSInstall.System.Directory ( copyTree )
main :: IO ()
main = do
mapM_ (flip hSetBuffering NoBuffering) [ stdout, stderr ]
withExceptionHandling $ do
opts <- parseOpts
buildTool <- determineBuildTool
putStrLn $ "Build tool detected: " <> show buildTool
when (op DumpIconSwitch . optDumpIcon $ opts) $ dumpStockIcon Nothing >> exitSuccess
di <- constructDeploymentInfo buildTool opts
when (op CleanSwitch . optClean $ opts) $ clean buildTool
deployApplication buildTool (optBuildMode opts) di
case optBuildMode opts of
AppImageExe exePath -> prepAppImageFiles exePath >>= mkAppImage exePath di
Project -> return ()
deployApplication :: BuildTool -> BuildMode -> DeploymentInfo -> IO ()
deployApplication buildTool mode di = do
-- Copy the binaries
let binFp = op BinDir . binDir $ di
Dir.createDirectoryIfMissing True binFp
installBinaries buildTool mode binFp
-- Copy the license
let licenseFile = "LICENSE"
licenseFileExists <- Dir.doesFileExist licenseFile
when licenseFileExists $ do
printf "\nCopying %s\n" licenseFile
let docFp = op DocDir . docDir $ di
Dir.createDirectoryIfMissing True docFp
Dir.copyFile licenseFile (docFp </> licenseFile)
-- Copy the static template directory
let tmplFp = op TmplDir tmplDir
tmplExists <- Dir.doesDirectoryExist tmplFp
when tmplExists $ do
printf "\nCopying distribution files from template dir (%s)\n" tmplFp
copyTree False tmplFp (op PrefixDir . prefixDir $ di)