{-# LANGUAGE CPP #-} import Control.Monad (when, unless, mplus) 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.Setup (defaultBuildFlags) import Distribution.Simple ( Args, defaultMainWithHooks, UserHooks(..), simpleUserHooks) import System.Exit (ExitCode(..)) import System.FilePath ( (), splitDirectories, isAbsolute ) import System.IO (openFile, IOMode (..)) import System.Process import System.Directory ( getCurrentDirectory, createDirectoryIfMissing , setCurrentDirectory, findExecutable, canonicalizePath , removeFile, doesDirectoryExist ) main :: IO () main = defaultMainWithHooks hooks where hooks = simpleUserHooks { runTests = runTests' } testCraftwerk :: a -> (BuildInfo -> a) -> PackageDescription -> a testCraftwerk dflt f pd = fromMaybe dflt $ listToMaybe [ f (buildInfo exe) | exe <- executables pd , exeName exe == "test-craftwerk" ] runTests' :: Args -> Bool -> PackageDescription -> LocalBuildInfo -> IO () runTests' args0 _unknown pd lbi = do let args = if null args0 then [] else "-t" : args0 let testDir = buildDir lbi "test-craftwerk" baseDir <- getCurrentDirectory canonicalBuildDir <- canonicalizePath (buildDir lbi) t <- doesDirectoryExist testDir unless t $ do unless (testCraftwerk 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 ]---" setCurrentDirectory testDir exitcode <- system $ unwords $ ("./test-craftwerk") : args unless (exitcode == ExitSuccess) $ fail "Test Failed"