packages feed

llvm-pkg-config-0.0.3: src/Main.hs

module Main (main) where

import qualified Options
import Shell.Utility.Exit (exitFailureMsg)

import qualified System.Process as Proc
import Distribution.Simple.Utils (setFileOrdinary, )

import qualified Data.List.Reverse.StrictSpine as ListRev
import qualified Data.Char as Char
import Text.Printf (printf, )

import qualified Control.Monad.Exception.Synchronous as Exc
import qualified Control.Monad.Trans.Class as MT


callLLVMConfig :: Options.T -> String -> IO String
callLLVMConfig flags arg =
   fmap (ListRev.dropWhile Char.isSpace) $
   Proc.readProcess (Options.llvmConfigPath flags) [arg] ""

createPkgConfig :: Options.T -> IO String
createPkgConfig flags = do
   fullVersion <- callLLVMConfig flags "--version"
   let version = takeWhile (\c -> Char.isDigit c || c=='.') fullVersion
   libs <- callLLVMConfig flags "--libs"
   ldflags <- callLLVMConfig flags "--ldflags"
   includedir <- callLLVMConfig flags "--includedir"
   return $ unlines $
      "Name: LLVM" :
      "Description: Low-level Virtual Machine compiler framework" :
      printf "Version: %s" version :
      "URL: http://www.llvm.org/" :
      "Requires:" :
      "Conflicts:" :
      printf "Libs: %s %s" ldflags libs :
      printf "Cflags: -I%s" includedir :
      []

run :: Options.T -> IO ()
run flags = do
   content <- createPkgConfig flags
   if Options.install flags
      then
         let path = Options.installPath flags
         in  writeFile path content >> setFileOrdinary path
      else putStr content

main :: IO ()
main =
   Exc.resolveT exitFailureMsg $
      MT.lift . run =<< Options.get