packages feed

liquid-fixpoint-0.2.1.0: Setup.hs

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