packages feed

HROOT-hist-0.10.0.2: Config.hs

{-# LANGUAGE ScopedTypeVariables #-}

module Config where

import Distribution.PackageDescription
import Distribution.Simple
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Setup
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)