packages feed

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