#! /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