-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSetup.hs
68 lines (56 loc) · 2.22 KB
/
Setup.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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