/
Config.hs
91 lines (72 loc) · 2.56 KB
/
Config.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
{-# LANGUAGE ScopedTypeVariables #-}
module Config where
import Data.List
import Data.Maybe
import Control.Applicative
import Control.Monad
import Distribution.Simple
import Distribution.Simple.BuildPaths
import Distribution.Simple.Setup
import Distribution.PackageDescription
import Distribution.Simple.LocalBuildInfo
import Distribution.System
import System.Exit
import System.Process
import System.FilePath
import System.Directory
import System.Info
myConfigHook :: UserHooks
myConfigHook = simpleUserHooks {
confHook = hookfunction
}
hookfunction :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags
-> IO LocalBuildInfo
hookfunction x cflags = do
binfo <- confHook simpleUserHooks x cflags
let pkg_descr = localPkgDescr binfo
r_pbi <- config binfo
let newbinfo =
case r_pbi of
Just pbi -> binfo { localPkgDescr =
updatePackageDescription pbi pkg_descr }
Nothing -> do
let r_lib = library pkg_descr
case r_lib of
Just lib ->
let binfo2 = libBuildInfo lib
newlib = lib { libBuildInfo = binfo2 { cSources = [] }}
in binfo {localPkgDescr = pkg_descr {library = Just newlib}}
Nothing -> error "some library setting is wrong."
return newbinfo
config :: LocalBuildInfo -> IO (Maybe HookedBuildInfo)
config bInfo = do
(excode,out,err) <- readProcessWithExitCode "pkg-config" ["--cflags", "gtk+-2.0"] ""
incdirs <- case excode of
ExitSuccess -> return . extractIncDir $ out
_ -> error $ ("failure when running pkg-config --cflags gtk+-2.0 :\n" ++ err)
let Just lib = library . localPkgDescr $ bInfo
buildinfo = libBuildInfo lib
let hbi = emptyBuildInfo { extraLibs = extraLibs buildinfo
, extraLibDirs = extraLibDirs buildinfo
, includeDirs = incdirs ++ includeDirs buildinfo
}
let (r :: Maybe HookedBuildInfo) = Just (Just hbi, [])
-- putStrLn $ show hbi
return r
-- data CFlagsOptionSet = CFlagsOptionSet {
-- includedirs :: [String]
-- others :: [String]
-- }
extractIncDir :: String -> [String]
extractIncDir = (mapMaybe parseCFlags) . words
parseCFlags :: String -> Maybe String
parseCFlags [] = Nothing
parseCFlags str@(x:xs) =
case x of
'-' -> if null xs
then Nothing
else let (y:ys) = xs
in case y of
'I' -> Just ys
_ -> Nothing
_ -> Nothing