on master help sign in
Invoke external code generator
783ddc3Edwin Brady
src/IRTS/Compiler.hs+17−8
@@ -43,6 +43,7 @@ import qualified Data.Map as M
43import qualified Data.Set as S
43import qualified Data.Set as S
44import System.Process
44import System.Process
45import System.IO
45import System.IO
46+import System.Exit
46import System.Directory
47import System.Directory
47import System.Environment
48import System.Environment
48import System.FilePath ((</>), addTrailingPathSeparator)
49import System.FilePath ((</>), addTrailingPathSeparator)
@@ -114,14 +115,22 @@ compile codegen f tm
114 ex <- doesFileExist f
115 ex <- doesFileExist f
115 if ex then return f else return h
116 if ex then return f else return h
116
117
117−generate :: Codegen -> CodegenInfo -> IO ()
118+generate :: Codegen -> FilePath -> CodegenInfo -> IO ()
118−generate codegen ir = case codegen of
119+generate codegen mainmod ir
120+ = case codegen of
121+ -- Built-in code generators (FIXME: lift these out!)
119− Via "c" -> codegenC ir
122+ Via "c" -> codegenC ir
120− Via "java" -> codegenJava ir
123+ Via "java" -> codegenJava ir
121− Via "javascript" -> codegenJavaScript ir
124+ Via "javascript" -> codegenJavaScript ir
122− Via "node" -> codegenNode ir
125+ Via "node" -> codegenNode ir
123− Via "llvm" -> codegenLLVM ir
126+ Via "llvm" -> codegenLLVM ir
127+ -- Any external code generator
128+ Via cg -> do let cmd = "idris-" ++ cg ++ " " ++ mainmod ++
129+ " -o " ++ outputFile ir
130+ exit <- system cmd
131+ when (exit /= ExitSuccess) $
132+ putStrLn ("FAILURE: " ++ show cmd)
124− Bytecode -> dumpBC (simpleDecls ir) (outputFile ir)
133+ Bytecode -> dumpBC (simpleDecls ir) (outputFile ir)
125
134
126irMain :: TT Name -> Idris LDecl
135irMain :: TT Name -> Idris LDecl
127irMain tm = do
136irMain tm = do
src/Idris/REPL.hs+3−2
@@ -1040,7 +1040,7 @@ process fn Execute
1040 runIO $ hClose tmph
1040 runIO $ hClose tmph
1041 t <- codegen
1041 t <- codegen
1042 ir <- compile t tmpn m
1042 ir <- compile t tmpn m
1043− runIO $ generate t ir
1043+ runIO $ generate t (head (idris_imported ist)) ir
1044 case idris_outputmode ist of
1044 case idris_outputmode ist of
1045 RawOutput h -> do runIO $ system tmpn
1045 RawOutput h -> do runIO $ system tmpn
1046 return ()
1046 return ()
@@ -1053,7 +1053,8 @@ process fn (Compile codegen f)
1053 (PApp fc (PRef fc (sUN "run__IO"))
1053 (PApp fc (PRef fc (sUN "run__IO"))
1054 [pexp $ PRef fc (sNS (sUN "main") ["Main"])])
1054 [pexp $ PRef fc (sNS (sUN "main") ["Main"])])
1055 ir <- compile codegen f m
1055 ir <- compile codegen f m
1056+ i <- getIState
1056− runIO $ generate codegen ir
1057+ runIO $ generate codegen (head (idris_imported i)) ir
1057 where fc = fileFC "main"
1058 where fc = fileFC "main"
1058process fn (LogLvl i) = setLogLevel i
1059process fn (LogLvl i) = setLogLevel i
1059-- Elaborate as if LHS of a pattern (debug command)
1060-- Elaborate as if LHS of a pattern (debug command)
src/Idris/REPLParser.hs+6−1
@@ -41,9 +41,14 @@ pCmd = do P.whiteSpace; do cmd ["q", "quit"]; eof; return Quit
41 return (ModImport (toPath f))
41 return (ModImport (toPath f))
42 <|> do cmd ["e", "edit"]; eof; return Edit
42 <|> do cmd ["e", "edit"]; eof; return Edit
43 <|> do cmd ["exec", "execute"]; eof; return Execute
43 <|> do cmd ["exec", "execute"]; eof; return Execute
44+ <|> try (do cmd ["c", "compile"]
45+ i <- get
46+ f <- P.identifier
47+ eof
48+ return (Compile (Via "c") f))
44 <|> do cmd ["c", "compile"]
49 <|> do cmd ["c", "compile"]
45 i <- get
50 i <- get
46− c <- option (opt_codegen $ idris_options i) codegenOption
51+ c <- codegenOption
47 f <- P.identifier
52 f <- P.identifier
48 eof
53 eof
49 return (Compile c f)
54 return (Compile c f)