packages feed

hruby-0.2.3: Setup.hs

import Distribution.Simple
import Distribution.Verbosity
import Distribution.Simple.Configure
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Utils
import Distribution.PackageDescription
import System.Environment

getBuildInfo :: LocalBuildInfo -> BuildInfo
getBuildInfo l = case library (localPkgDescr l) of
                     Just x -> libBuildInfo x
                     Nothing -> error "Could not find the buildinfo!"

setBuildInfo :: LocalBuildInfo -> BuildInfo -> LocalBuildInfo
setBuildInfo l b = l { localPkgDescr = lpd' }
    where
        lpd = localPkgDescr l
        Just li = library lpd
        li' = li { libBuildInfo = b }
        lpd' = lpd { library = Just li' }

main :: IO ()
main = defaultMainWithHooks myhooks
    where
        myhooks    = simpleUserHooks { confHook = (\a b -> configure a b >>= myConfHook) }
        myConfHook h = do
            let buildinfos = getBuildInfo h
            -- hunt for libraries
            let rubies = ["ruby2.1", "ruby2.0", "ruby1.9", "ruby1.8", "ruby"]
                pathes = ["/usr/lib", "/usr/local/lib"]
                inc21 = ["/usr/include/ruby-2.1.0", "/usr/include/x86_64-linux-gnu/ruby-2.1.0", "/usr/include/ruby-2.1.0/x86_64-linux"]
                inc20 = ["/usr/include/ruby-2.0.0", "/usr/include/x86_64-linux-gnu/ruby-2.0.0", "/usr/include/ruby-2.0.0/x86_64-linux"]
                inc19 = ["/usr/lib/ruby/1.9/x86_64-linux"]
                inc18 = ["/usr/lib/ruby/1.8/x86_64-linux"]
                r21 = ("ruby2.1", inc21, ["-DRUBY2","-DRUBY21"])
                r20 = ("ruby2.0", inc20, ["-DRUBY2"])
                r19 = ("ruby1.9", inc19, [])
                r18 = ("ruby1.8", inc18, [])
            f <- findFirstFile (\(p,r) -> p ++ "/lib" ++ r ++ ".so") [(p,r) | p <- pathes, r <- rubies]
            let rubystring = maybe "" snd f
                lg s = notice normal ("Auto detected " ++ s)
            (e,i,c) <- case fmap snd f of
                           Just "ruby2.1" -> lg rubystring >> return r21
                           Just "ruby2.0" -> lg rubystring >> return r20
                           Just "ruby1.9" -> lg rubystring >> return r19
                           Just "ruby1.8" -> lg rubystring >> return r18
                           Just "ruby" -> do
                                is21 <- findFirstFile id inc21
                                is20 <- findFirstFile id inc20
                                is19 <- findFirstFile id inc19
                                is18 <- findFirstFile id inc18
                                case filter ((/= Nothing) . fst) [(is21,r21), (is20,r20), (is19,r19), (is18,r18)] of
                                    ((_,(n,inc,flgs)):_) -> lg n >> return ("ruby",inc,flgs)
                                    _ -> die "Could not find the ruby library"
                           Just x -> die $ "Did find this (this should not happen): " ++ x
                           _ -> die "Could not find the ruby library"
            let bi = buildinfos { extraLibs = e : extraLibs buildinfos
                                , includeDirs = includeDirs buildinfos ++ i
                                , ccOptions = ccOptions buildinfos ++ c
                                }
            return (setBuildInfo h bi)