packages feed

gsl-random-0.4.1: Setup.lhs

#!/usr/bin/env runhaskell

> import Distribution.Simple
> import Distribution.PackageDescription
> import Distribution.Version
> 
> import Distribution.Simple.LocalBuildInfo
> import Distribution.Simple.Program
> import Distribution.Verbosity
> 
> import Data.List (findIndices)
> 
> 
> main = defaultMainWithHooks simpleUserHooks {
>   hookedPrograms = [gslconfigProgram],
> 
>   confHook = \pkg flags -> do
>     lbi <- confHook simpleUserHooks pkg flags
>     bi <- gslBuildInfo lbi
>     
>     return lbi {
>       localPkgDescr = updatePackageDescription
>                         (Just bi, []) (localPkgDescr lbi)
>     } 
> }
> 
> gslconfigProgram = (simpleProgram "gsl-config") {
>     programFindLocation = \verbosity ->
>       findProgramLocation verbosity "gsl-config"
>   }
> 
> gslBuildInfo :: LocalBuildInfo -> IO BuildInfo
> gslBuildInfo lbi = do
>   (gslconfigProg, _) <- requireProgram verbosity
>                          gslconfigProgram (withPrograms lbi)
>   let gslconfig = rawSystemProgramStdout verbosity gslconfigProg
> 
>   cflags <- words `fmap` gslconfig ["--cflags"]
>   libs <- words `fmap` gslconfig ["--libs"]
> 
>   return emptyBuildInfo {
>       frameworks    =  [ libs !! (i+1)
>                        | i <- findIndices (== "-framework") libs
>                        , i + 1 < length libs ]
>     , extraLibs     = flag "-l" libs
>     , extraLibDirs  = flag "-L" libs
>     , includeDirs   = flag "-I" cflags
>   }
>   where
>     verbosity = normal -- honestly, this is a hack
>     flag f ws = 
>       let l = length f in [ drop l w | w <- ws, take l w == f ]
>     
>