import Control.Monad import Data.Maybe import Distribution.PackageDescription import Distribution.Simple import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Setup import Distribution.System import System.Directory import System.Environment import System.Exit import System.FilePath import System.Process main = defaultMainWithHooks fixHooks where fixHooks = simpleUserHooks { postBuild = buildFixpoint , postCopy = copyFixpoint , postInst = copyFixpoint } copyFixpoint _ _ pkg lbi = do copyFile fixpoint bin where allDirs = absoluteInstallDirs pkg lbi NoCopyDest bin = bindir allDirs "fixpoint.native" ++ if system == "i686-w64-mingw32" then ".exe" else "" fixpoint = "external" "fixpoint" "fixpoint.native" ++ if build then "" else "-" ++ system system = case hostPlatform lbi of Platform I386 Linux -> "i386-linux" Platform X86_64 Linux -> "x86_64-linux" Platform X86_64 OSX -> "x86_64-darwin" Platform _ Windows -> "i686-w64-mingw32" _ -> error "We don't have a prebuilt fixpoint.native for your system, please install with -fbuild-external (requires ocaml)" flags = configConfigurationsFlags $ configFlags lbi build = fromMaybe False $ lookup (FlagName "build-external") flags buildFixpoint _ _ pkg lbi = when build $ do setEnv "Z3MEM" (show z3mem) 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 build = fromMaybe False $ lookup (FlagName "build-external") flags executeShellCommand cmd = putStrLn ("EXEC: " ++ cmd) >> system cmd >>= check where check (ExitSuccess) = return () check (ExitFailure n) = error $ "cmd: " ++ cmd ++ " failure code " ++ show n