packages feed

craftwerk-0.1: Setup.hs

{-# 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"