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