speculation/Setup.lhs

108 lines
3.7 KiB
Plaintext
Raw Normal View History

2010-06-27 11:44:40 +04:00
#!/usr/bin/env runhaskell
2010-06-28 09:25:18 +04:00
\begin{code}
{-# LANGUAGE CPP #-}
2010-06-28 18:34:49 +04:00
import Control.Monad (when, unless, mplus)
2010-06-28 18:34:49 +04:00
import Data.Maybe (listToMaybe, fromMaybe)
import Distribution.PackageDescription
(PackageDescription, buildable, exeName, buildInfo, executables, customFieldsBI, BuildInfo)
import Distribution.Verbosity (normal)
import Distribution.Simple.Build (build)
import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..))
import Distribution.Simple.PreProcess (knownSuffixHandlers)
import Distribution.Simple.Program (programFindLocation, lookupKnownProgram )
import Distribution.Simple.Setup (defaultBuildFlags)
import Distribution.Simple
( Args, defaultMainWithHooks, UserHooks(..), simpleUserHooks)
import System.Exit (ExitCode(..))
import System.FilePath ( (</>), splitDirectories, isAbsolute )
import System.IO (openFile, IOMode (..))
2010-06-28 09:25:18 +04:00
import System.Process
import System.Directory
( getCurrentDirectory, createDirectoryIfMissing
, setCurrentDirectory, findExecutable, canonicalizePath
, removeFile, doesDirectoryExist
)
main :: IO ()
main = defaultMainWithHooks hooks
2010-06-28 09:25:18 +04:00
hooks :: UserHooks
2011-01-19 21:50:47 +03:00
hooks = simpleUserHooks { runTests = runMyTests }
2010-06-28 09:25:18 +04:00
findHPC :: LocalBuildInfo -> IO FilePath
findHPC lbi = do
Just hpcProgram <- return $ lookupKnownProgram "hpc" $ withPrograms lbi
Just hpc <- programFindLocation hpcProgram normal
return hpc
`catch` \_ -> do
2010-06-28 09:25:18 +04:00
Just hpc <- findExecutable "hpc"
return hpc
2010-06-28 18:34:49 +04:00
testSpeculation :: a -> (BuildInfo -> a) -> PackageDescription -> a
testSpeculation dflt f pd =
fromMaybe dflt $ listToMaybe
[ f (buildInfo exe)
| exe <- executables pd
, exeName exe == "test-speculation" ]
2011-01-19 21:50:47 +03:00
runMyTests :: Args -> Bool -> PackageDescription -> LocalBuildInfo -> IO ()
runMyTests args0 _unknown pd lbi = do
2010-06-28 09:25:18 +04:00
let args = if null args0 then [] else "-t" : args0
-- dir <- getWorkingDirectory
let testDir = buildDir lbi </> "test-speculation"
baseDir <- getCurrentDirectory
canonicalBuildDir <- canonicalizePath (buildDir lbi)
t <- doesDirectoryExist testDir
unless t $ do
2010-06-28 18:34:49 +04:00
unless (testSpeculation False buildable pd) $ do
fail "Reconfigure with 'cabal configure -ftests' or 'cabal install -ftests' and try again."
putStrLn "building tests"
build pd lbi defaultBuildFlags knownSuffixHandlers
putStrLn "tests built"
2010-06-28 18:34:49 +04:00
2010-06-28 09:25:18 +04:00
setCurrentDirectory testDir
2010-06-28 18:34:49 +04:00
let customFields = testSpeculation [] customFieldsBI pd
profiling = maybe False (const True) $ lookup "x-hpc" customFields
when profiling $ do
removeFile "test-speculation.tix"
putStrLn $ "removed test-speculation.tix"
`catch` \_ -> return ()
2010-06-28 09:25:18 +04:00
exitcode <- system $ unwords $ "test-speculation" : args
unless (exitcode == ExitSuccess) $
fail "test failed"
2010-06-28 18:34:49 +04:00
when profiling $ do
hpc <- findHPC lbi
exitcode <- system $ unwords $ hpc
2010-06-28 09:25:18 +04:00
: "report"
: "test-speculation"
: "--srcdir=../../.."
: []
2010-06-28 18:34:49 +04:00
unless (exitcode == ExitSuccess) $
fail "hpc report failed"
let markupDir base = base </> "doc" </> "html" </> "test-speculation"
createDirectoryIfMissing True (markupDir canonicalBuildDir)
exitcode <- system $ unwords $ hpc
2010-06-28 09:25:18 +04:00
: "markup"
: "test-speculation"
: "--srcdir=../../.."
: ("--destdir=" ++ markupDir canonicalBuildDir)
: "--exclude=Main"
: []
2010-06-28 18:34:49 +04:00
unless (exitcode == ExitSuccess) $
2010-06-28 09:25:18 +04:00
fail "hpc report failed"
2010-06-28 18:34:49 +04:00
putStrLn $ "Code coverage created: " ++ (markupDir (buildDir lbi) </> "hpc_index.html")
2010-06-28 09:25:18 +04:00
\end{code}