{-# OPTIONS_GHC -Wall #-} module Main where import Data.Char (isSpace) import Data.List (dropWhileEnd) import Data.Version (showVersion) import Distribution.PackageDescription (PackageDescription(..), defaultExtensions, libBuildInfo) import Distribution.Simple (defaultMainWithHooks, UserHooks(..), simpleUserHooks) import Distribution.Simple (packageVersion) import Distribution.Simple.BuildPaths (autogenModulesDir) import Distribution.Simple.LocalBuildInfo (LocalBuildInfo()) import Distribution.Simple.Setup (BuildFlags(buildVerbosity), fromFlag) import Distribution.Simple.Utils (createDirectoryIfMissingVerbose) import Distribution.Text (display) import Distribution.Verbosity (Verbosity) import System.Exit (ExitCode(..)) import System.FilePath (()) import System.Process (readProcessWithExitCode) main :: IO () main = defaultMainWithHooks simpleUserHooks { buildHook = \pkg lbi hooks flags -> do generateBuildModule (fromFlag (buildVerbosity flags)) pkg lbi buildHook simpleUserHooks pkg lbi hooks flags } git :: [String] -> IO String git args = do (code, out, _) <- readProcessWithExitCode "git" args "" pure $ case code of ExitSuccess -> dropWhileEnd isSpace out ExitFailure{} -> "Unknown" generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO () generateBuildModule verbosity pkg lbi = do let dir = autogenModulesDir lbi createDirectoryIfMissingVerbose verbosity True dir gitTag <- git ["describe", "--dirty", "--tags", "--all"] gitCommit <- git ["rev-parse", "HEAD"] gitDate <- git ["log", "HEAD", "-1", "--format=%cd"] --buildTime <- readProcess "date" ["-R"] "" let exts = maybe [] (map display . defaultExtensions . libBuildInfo) (library pkg) writeFile (dir "Build_chili.hs") $ unlines $ [ "module Build_chili where" , "" , "import Chili.Intro" , "" , "gitCommit :: String" , "gitCommit = " ++ show gitCommit , "" , "gitTag :: String" , "gitTag = " ++ show gitTag , "" , "gitDate :: String" , "gitDate = " ++ show gitDate , "" -- Think about this because of reproducible builds -- , "buildTime :: String" -- , "buildTime = " ++ show buildTime -- , "" , "chiliVersion :: String" , "chiliVersion = " ++ show (showVersion $ packageVersion pkg) , "" , "languageExtensions :: [String]" , "languageExtensions = " ++ show exts ]