hint-0.2: Setup.lhs
#! /usr/bin/env runhaskell
> import Distribution.Simple
> import Distribution.Simple.Program
> import Distribution.Simple.LocalBuildInfo hiding ( libdir )
> import Distribution.Simple.Setup
> import Distribution.Verbosity
> import Distribution.Simple.Utils ( warn, notice, die )
> import System.IO ( writeFile )
> import System.FilePath ( (</>) )
> import System.Directory ( doesDirectoryExist )
> import Control.Monad ( liftM )
> main :: IO ()
> main = defaultMainWithHooks myHooks
> where myHooks = let h = defaultUserHooks
> in h{postConf = myPostConf (postConf h)}
> myPostConf oldHook = \a f p lbi -> do let verb = configVerbose f
> saveGhcLibdir verb lbi
> oldHook a f p lbi
> saveGhcLibdir :: Verbosity -> LocalBuildInfo -> IO ()
> saveGhcLibdir verbosity lbi =
> do libdir <- removeTrailingEOL `liftM`
> queryGHC verbosity lbi ["--print-libdir"]
> is_ok <- doesDirectoryExist libdir
> if not is_ok
> then warn verbosity $ concat ["Suspicious ghc libdir: '",
> libdir,
> "'"]
> else notice verbosity $ concat ["Using ghc libdir: '",
> libdir,
> "'"]
> --
> let mod_dir = "Language" </> "Haskell" </> "Interpreter" </> "GHC"
> let ghc_libdir_module_file = "src" </> mod_dir </> "LibDir.hs"
> writeFile ghc_libdir_module_file $ mkGhcLibdirModule libdir
> queryGHC :: Verbosity -> LocalBuildInfo -> [String] -> IO String
> queryGHC verbosity lbi args =
> do ghc <- maybe (die "GHC not found")
> return
> (lookupProgram ghcProgram $ withPrograms lbi)
> --
> rawSystemProgramStdout verbosity ghc args
> mkGhcLibdirModule :: FilePath -> String
> mkGhcLibdirModule libdir = unlines m
> where m = ["-- Autogenerated by Cabal script... DO NOT MODIFY!",
> "module Language.Haskell.Interpreter.GHC.LibDir ( ghc_libdir )",
> "",
> "where",
> "",
> "ghc_libdir :: FilePath",
> "ghc_libdir = " ++ show libdir]
> removeTrailingEOL :: String -> String
> removeTrailingEOL [] = []
> removeTrailingEOL ['\n'] = []
> removeTrailingEOL (x:xs) = x : removeTrailingEOL xs