import Control.Monad import Data.Maybe import Distribution.PackageDescription import Distribution.Simple import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Setup import System.Posix.Env import System.Process import System.Exit main = defaultMainWithHooks fixHooks where fixHooks = simpleUserHooks { postBuild = buildFixpoint , postCopy = copyFixpoint , postInst = copyFixpoint } buildFixpoint _ _ pkg lbi = do setEnv "Z3MEM" (show z3mem) True executeShellCommand "./configure" executeShellCommand "./build.sh" executeShellCommand "chmod a+x external/fixpoint/fixpoint.native " where allDirs = absoluteInstallDirs pkg lbi NoCopyDest binDir = bindir allDirs ++ "/" flags = configConfigurationsFlags $ configFlags lbi z3mem = fromMaybe False $ lookup (FlagName "z3mem") flags copyFixpoint _ _ pkg lbi = do executeShellCommand $ "cp external/fixpoint/fixpoint.native " ++ binDir when z3mem $ executeShellCommand $ "cp external/z3/lib/libz3.* " ++ binDir where allDirs = absoluteInstallDirs pkg lbi NoCopyDest binDir = bindir allDirs ++ "/" flags = configConfigurationsFlags $ configFlags lbi z3mem = fromMaybe False $ lookup (FlagName "z3mem") flags executeShellCommand cmd = putStrLn ("EXEC: " ++ cmd) >> system cmd >>= check where check (ExitSuccess) = return () check (ExitFailure n) = error $ "cmd: " ++ cmd ++ " failure code " ++ show n