packages feed

HROOT-0.5.0.1: Config.hs

{-# LANGUAGE ScopedTypeVariables #-}

module Config where
 
import Control.Monad.Identity

import Distribution.Simple
import Distribution.Simple.Setup
import Distribution.PackageDescription
import Distribution.Simple.LocalBuildInfo

import System.Exit
import System.Process

import Text.Parsec

config :: LocalBuildInfo -> IO (Maybe HookedBuildInfo)
config bInfo = do 
  (excode, out, err) <- readProcessWithExitCode "root-config" ["--glibs"] ""
  liboptset' <- case excode of 
                  ExitSuccess -> do  
--                    putStrLn $ show $ words out
--                    putStrLn $ show $ libraryOptions (words out)
--                    putStrLn $ show $ mkLibraryOptionSet . words $ out
                    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  
--                 putStrLn $ out2
                 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, []) 
--  putStrLn $ "show here"
--  putStrLn $ show r
  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 = parse libraryOptionClassifier "" x
              in  case r of 
                    Left msg -> error (show msg)
                    Right result -> result


libraryOptionClassifier :: ParsecT String () Identity LibraryOption
libraryOptionClassifier = 
  try (string "-L" >> many1 anyChar >>= return . Dir) 
  <|> try (string "-l" >> many1 anyChar >>= return . Lib)
  <|> (many1 anyChar >>= return . Opt)