1module Main where
2
3import Distribution.Simple
4import Distribution.Simple.Setup
5import Distribution.PackageDescription
6import Distribution.PackageDescription.Parsec
7import Distribution.Verbosity
8import Control.Monad
9import Data.List
10import System.Environment(getArgs)
11import Control.Applicative
12
13main :: IO ()
14main = do
15    args <- getArgs
16    let targetPrefix = "--configure-option="
17    let targetArg = find (targetPrefix `isPrefixOf`) args
18    let targetName = fmap (drop (length targetPrefix)) targetArg
19    let hooks = autoconfUserHooks {
20        readDesc = readDescHook targetName
21    }
22    defaultMainWithHooksArgs hooks args
23
24buildLibQEmu :: Args -> BuildFlags -> IO HookedBuildInfo
25buildLibQEmu args flags = do
26    putStrLn "Building haskell sel4 ..."
27    preBuild autoconfUserHooks args flags
28
29printKnownTargets :: IO ()
30printKnownTargets = do
31    putStrLn "Recognised targets are:"
32    mapM_ (putStrLn.('\t':).fst) targets
33
34targets =
35    [ ("arm-exynos",    ("ARM",     "Exynos4210",   []))
36    , ("arm-kzm",       ("ARM",     "KZM",          []))
37    , ("arm-sabre",     ("ARM",     "Sabre",        []))
38    , ("x64-pc99",      ("X64",     "PC99",         []))
39    , ("arm-tk1-nosmmu",("ARM", "TK1",          ["CONFIG_ARM_HYPERVISOR_SUPPORT"]))
40    , ("arm-tk1",       ("ARM", "TK1",          ["CONFIG_ARM_HYPERVISOR_SUPPORT",
41                                                     "CONFIG_ARM_SMMU"]))
42    , ("riscv-spike",   ("RISCV64", "Spike",        []))
43    ]
44
45getPlatform :: Maybe String -> IO (Maybe (String, String, [String]))
46getPlatform targetName =
47      return $ do
48        targetName <- targetName
49        snd <$> find ((==targetName).fst) targets
50
51readDescHook :: Maybe String -> IO (Maybe GenericPackageDescription)
52readDescHook targetName = do
53    platform <- getPlatform targetName
54    (arch, plat, extraopts) <- case platform of
55       Just p -> return p
56       Nothing -> do
57         putStrLn "Please specify a target: --configure-option=\"<target>\""
58         printKnownTargets
59         fail "No target"
60    dscp <- readGenericPackageDescription normal "SEL4.cabal"
61    pkg_lib_upd <- case condLibrary dscp of
62      Just CondNode {condTreeData = lib,condTreeConstraints = cons,condTreeComponents=comp} -> do
63        bi_upd <- do
64          let bi = libBuildInfo lib
65          let opts = cppOptions bi ++ ["-DPLATFORM=" ++ plat] ++ ["-DTARGET=" ++ arch]
66                                   ++ ["-DPLATFORM_" ++ plat] ++ ["-DTARGET_" ++ arch]
67                                   ++ ["-D" ++ opt | opt <- extraopts ]
68          return $ bi { cppOptions = opts }
69        return $ Just CondNode {condTreeData = lib { libBuildInfo = bi_upd}
70                               ,condTreeConstraints = cons
71                               ,condTreeComponents = comp}
72      Nothing -> return Nothing
73    let dscp_upd = dscp { condLibrary = pkg_lib_upd}
74    print dscp_upd
75    return $ Just dscp_upd
76
77