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)