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