packages feed

sbv-0.9: Setup.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Main
-- Copyright   :  (c) Levent Erkok
-- License     :  BSD3
-- Maintainer  :  erkokl@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Setup module for the sbv library
-----------------------------------------------------------------------------

{-# OPTIONS_GHC -Wall #-}
module Main(main) where

import Control.Monad(when)
import Distribution.PackageDescription
import Distribution.Simple
import Distribution.Simple.LocalBuildInfo(LocalBuildInfo(..))
import Distribution.Text(display)
import System.Directory(findExecutable)
import System.Process(system)
import System.Exit
import Data.SBV.Provers.Prover(SMTSolver(..), SMTConfig(..), defaultSMTCfg)

main :: IO ()
main = defaultMainWithHooks simpleUserHooks{ runTests = unittest True, postInst = unittest False}
 where checkDefSolver = do
                let ex = executable $ solver $ defaultSMTCfg
                    nm = name $ solver $ defaultSMTCfg
                mbP <- findExecutable ex
                case mbP of
                  Nothing -> do putStrLn $ "*** The sbv library requires the default solver " ++ nm ++ " to be installed."
                                putStrLn $ "*** The executable " ++ show ex ++ " must be in your path."
                                putStrLn $ "*** Do not forget to install " ++ nm ++ "!"
                  Just _  -> return ()
       unittest forced _ _ _ lbi = do
         let testers = [ex | ex <- executables pkgDesc, modulePath ex == "SBVUnitTest/SBVUnitTest.hs"]
         case testers of
           [tp] -> runTester tp
           _    -> bailOut
         where pkgDesc  = localPkgDescr lbi
               sbvName  = display $ package pkgDesc
               report  = putStrLn $ "*** Please report to the maintainer: " ++ maintainer pkgDesc
               bailOut = do putStrLn "*** Cannot find SBV unit-tester program!"
                            report
                            exitWith $ ExitFailure 1
               runTester tp = do
                        when (not forced) $
                                case lookup "x-run-unittests" (customFieldsBI (buildInfo tp)) of
                                        Just "False" -> do checkDefSolver
                                                           putStrLn "*** Please run \"SBVUnitTests\" executable to perform unit-tests."
                                                           putStrLn $ "*** Package " ++ sbvName ++ " installed successfully. Enjoy!"
                                                           putStrLn $ "*** Further info: " ++ homepage pkgDesc
                                                           exitWith ExitSuccess
                                        _            -> return ()
                        mbP <- findExecutable $ exeName tp
                        case mbP of
                          Nothing -> bailOut
                          Just p  -> do ec <- system p
                                        case ec of
                                          ExitSuccess   -> putStrLn $ sbvName ++ " installed and unit-tests successfully run. Enjoy!"
                                          ExitFailure n -> if n == 1 --  couldn't run test cases..
                                                           then putStrLn "*** SBV unit-tests failed! Bailing out."
                                                           else putStrLn "*** Some SBV unit-tests failed!" >> report
                                        exitWith ec