hint-0.1: Setup.lhs
#! /usr/bin/env runhaskell
> import Distribution.Simple
> import Distribution.Simple.LocalBuildInfo ( LocalBuildInfo(..), autogenModulesDir )
> import Distribution.Simple.Utils ( warn, die )
> import System.IO ( readFile, writeFile )
> import System.Cmd ( system )
> import System.Exit ( ExitCode(..) )
> import System.FilePath ( (</>) )
> import System.Directory ( doesDirectoryExist, createDirectoryIfMissing, removeFile )
> import Control.Monad ( when, liftM )
> main = defaultMainWithHooks myHooks
> where myHooks = let h = defaultUserHooks in h{postConf = myPostConf (postConf h)}
> myPostConf oldHook = \a f p lbi -> (saveGhcLibdir lbi >> oldHook a f p lbi)
> saveGhcLibdir :: LocalBuildInfo -> IO ()
> saveGhcLibdir lbi = do
> let libdir_file = ".ghc-libdir"
> let cmd = unwords [compilerPath . compiler $ lbi, "--print-libdir", ">", libdir_file]
> result <- system cmd
> --
> case result of
> ExitFailure _ -> die "Could not determine ghc's libdir!"
> ExitSuccess ->
> do
> libdir <- removeTrailingEOL `liftM` readFile libdir_file
> --
> isOk <- doesDirectoryExist libdir
> if not isOk
> then warn $ "Suspicious ghc libdir: '" ++ libdir ++ "'"
> else message $ "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
> --
> removeFile libdir_file
> mkGhcLibdirModule :: FilePath -> String
> mkGhcLibdirModule libdir = unlines ["-- 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
> message :: String -> IO ()
> message s = putStrLn $ "configure: " ++ s