packages feed

jalla-0.1.0: Setup.hs

import Distribution.Simple
import Distribution.Simple.Setup
import Distribution.Simple.Program
import Distribution.Simple.Program.Types
import Distribution.Simple.Utils
import Distribution.Verbosity
import Distribution.PackageDescription
import System.FilePath
import System.Process
import System.Exit

main = defaultMainWithHooks $ 
         simpleUserHooks {
           hookedPrograms = [], --scons : hookedPrograms simpleUserHooks,
           preConf = sconsPreConf -- >> (preConf simpleUserHooks) a c
           }


sconsPreConf :: Args -> ConfigFlags -> IO HookedBuildInfo
sconsPreConf args cf = do
  let flags = configConfigurationsFlags cf
      mf = lookup (FlagName "build_lapacke") flags
  case mf of
    Just True -> invokeScons
    _ -> return (Nothing, [])
  
invokeScons = do
  let lapackeDir = currentDir </> "lapacke"
  msl <- programFindLocation scons verbose
  let mSconsInvoke = msl >>= \sl -> 
        return (simpleConfiguredProgram "scons" (FoundOnSystem sl)) >>= \confScons ->
        return (programInvocation confScons []) >>= \sconsInvoke ->
        return (sconsInvoke { progInvokeCwd = Just lapackeDir })
        
  success <- 
    case mSconsInvoke of
      Just sconsInvoke -> 
        callProgram (progInvokePath sconsInvoke) [] (progInvokeCwd sconsInvoke)
      -- runProgramInvocation deafening sconsInvoke -- This is apparently not implemented in cabal.
      _ -> 
        die "*** Running scons has failed while trying to build LAPACKE. Is scons installed?" >>
        return False
  
  return $ if success 
           then (Just (emptyBuildInfo { buildable = True }), [])
           else (Just (emptyBuildInfo { buildable = False }), [])


callProgram :: FilePath -> [String] -> Maybe FilePath -> IO Bool
callProgram prog args cwd = do
  h <- runProcess prog args cwd Nothing Nothing Nothing Nothing 
  e <- waitForProcess h
  return $ e == ExitSuccess 

findScons :: Verbosity -> IO (Maybe FilePath)
findScons verb = do
  let locs = ["/usr/bin","/usr/local/bin","/usr/sbin","/usr/local/sbin"]
  ml <- mapM (findProgramLocation verb) locs
  return $ firstJust ml

scons :: Program
scons = simpleProgram "scons"

firstJust :: [Maybe a] -> Maybe a
firstJust [] = Nothing
firstJust (Just a:as) = Just a
firstJust (_:as) = firstJust as