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