packages feed

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