HROOT-0.6.2: Config.hs
{-# LANGUAGE ScopedTypeVariables #-}
module Config where
import Distribution.Simple
import Distribution.Simple.Setup
import Distribution.PackageDescription
import Distribution.Simple.LocalBuildInfo
import System.Exit
import System.Process
config :: LocalBuildInfo -> IO (Maybe HookedBuildInfo)
config bInfo = do
(excode, out, err) <- readProcessWithExitCode "root-config" ["--glibs"] ""
liboptset' <- case excode of
ExitSuccess -> do
return . Just . mkLibraryOptionSet . words $ out
_ -> do
putStrLn $ "root-config failure but I am installing HROOT without ROOT. It will not work. This is only for documentation."
return Nothing
(excode2,out2,err2) <- readProcessWithExitCode "root-config" ["--incdir"] ""
incdir' <- case excode2 of
ExitSuccess -> do
return . Just . head . words $ out2
_ -> do
putStrLn $ "root-config failure but I am installing HROOT without ROOT. It will not work. This is only for documentation."
return Nothing
let Just lib = library . localPkgDescr $ bInfo
buildinfo = libBuildInfo lib
let (r :: Maybe HookedBuildInfo) = case liboptset' of
Nothing -> Nothing
Just liboptset ->
case incdir' of
Nothing -> Nothing
Just incdir ->
let hbi = emptyBuildInfo { extraLibs = extraLibs buildinfo
++ libs liboptset
, extraLibDirs = libdirs liboptset
, includeDirs = incdir : includeDirs buildinfo
}
in Just (Just hbi, [])
return r
data LibraryOptionSet = LibraryOptionSet {
libs :: [String],
libdirs :: [String],
libopts :: [String]
} deriving Show
data LibraryOption = Lib String
| Dir String
| Opt String
deriving Show
mkLibraryOptionSet :: [String] -> LibraryOptionSet
mkLibraryOptionSet strs = let opts = libraryOptions strs
in foldr f (LibraryOptionSet [] [] []) opts
where f x (LibraryOptionSet l d o) = case x of
Lib st -> LibraryOptionSet (st:l) d o
Dir st -> LibraryOptionSet l (st:d) o
Opt st -> LibraryOptionSet l d (st:o)
libraryOptions :: [String] -> [LibraryOption] -- LibraryOptionSet
libraryOptions = map f
where f x = let r = parseLibraryOptionClassifier x
in case r of
Left msg -> error (show msg)
Right result -> result
parseLibraryOptionClassifier :: String -> Either String LibraryOption
parseLibraryOptionClassifier [] = Left "empty option"
parseLibraryOptionClassifier str@(x:xs) =
case x of
'-' -> if null xs
then Left "parse error"
else let (y:ys) = xs
in case y of
'L' -> Right (Dir ys)
'l' -> Right (Lib ys)
_ -> Right (Opt str)
_ -> Right (Opt str)