Wrote a dynamic compilation stuff that works (unable to test reboot yet)
This commit is contained in:
parent
ea607ba1b1
commit
1f6c64749d
7 changed files with 183 additions and 0 deletions
44
Main.hs
Normal file
44
Main.hs
Normal file
|
@ -0,0 +1,44 @@
|
|||
module Main where
|
||||
import System.Exit
|
||||
import System.Plugins
|
||||
|
||||
-- | Dynamic launching function
|
||||
main :: IO ()
|
||||
main = do
|
||||
putStrLn "hsbot starting..."
|
||||
m <- makeAll "Hsbot.hs" [] -- ghcargs
|
||||
(modul', imain) <- case m of
|
||||
MakeSuccess _ _ -> do
|
||||
ldstat <- load_ "Hsbot/Main.o" [".","Hsbot","Hsbot/Plugins"] "imain"
|
||||
case ldstat of
|
||||
LoadSuccess v m' -> return (v,m')
|
||||
LoadFailure e -> do
|
||||
putStrLn "Couldn't load Hsbot.Main.imain:"
|
||||
mapM_ putStrLn e
|
||||
exitWith $ ExitFailure 127
|
||||
MakeFailure e -> do
|
||||
putStrLn "FATAL: Couldn't compile Hsbot.hs:"
|
||||
mapM_ putStrLn e
|
||||
exitWith $ ExitFailure 127
|
||||
putStrLn "Compiled & Loaded Hsbot.Main.imain..."
|
||||
imain modul' reboot
|
||||
|
||||
-- | Dynamic rebooting function
|
||||
reboot :: Module -> a -> IO ()
|
||||
reboot modul' st = do
|
||||
mkstat <- makeAll "Hsbot.hs" [] --ghcargs
|
||||
case mkstat of
|
||||
MakeSuccess _ _ -> do
|
||||
unloadAll modul'
|
||||
ldstat <- load_ "Hsbot/Main.o" [".","Hsbot","Hsbot/Plugins"] "imain'"
|
||||
case ldstat of
|
||||
LoadSuccess v imain' -> do
|
||||
putStrLn "REBOOT: Successful recompilation & reloading, rebooting..."
|
||||
imain' v reboot st
|
||||
LoadFailure e -> fatality e
|
||||
MakeFailure e -> fatality e
|
||||
where
|
||||
fatality errs = do
|
||||
putStrLn $ "REBOOT: FATAL: Couldn't reboot thread, err:"
|
||||
mapM_ putStrLn errs
|
||||
|
Reference in a new issue