on fe7e319 help sign in
elk/compiler/Compiler.hs
71 lines 2.4 kB history raw
1module Main where
3import Control.Monad (foldM)
4import qualified Data.Map as Map
5import qualified Text.Blaze.Html.Renderer.Utf8 as Blaze
6import qualified Data.ByteString.Lazy.Char8 as BS
7import qualified System.Console.CmdArgs as CmdArgs
8import System.Directory
9import System.FilePath
10import GHC.Conc
12import Build.Dependencies (getSortedDependencies)
13import qualified Generate.Html as Html
14import qualified Metadata.Prelude as Prelude
15import qualified Build.Utils as Utils
16import qualified Build.Info as Info
17import qualified Build.Flags as Flag
18import qualified Build.File as File
20main :: IO ()
21main = do setNumCapabilities =<< getNumProcessors
22 compileArgs =<< CmdArgs.cmdArgs Flag.flags
24compileArgs :: Flag.Flags -> IO ()
25compileArgs flags =
26 case Flag.files flags of
27 [] -> putStrLn "Usage: elm [OPTIONS] [FILES]\nFor more help: elm --help"
28 fs -> mapM_ (build flags) fs
30build :: Flag.Flags -> FilePath -> IO ()
31build flags rootFile =
32 do let noPrelude = Flag.no_prelude flags
33 builtIns <- if noPrelude then return Map.empty else Prelude.interfaces
35 files <- if Flag.make flags
36 then getSortedDependencies (Flag.src_dir flags) builtIns rootFile
37 else return [rootFile]
39 (moduleName, interfaces) <-
40 File.build flags (length files) builtIns "" files
42 js <- foldM appendToOutput BS.empty files
44 (extension, code) <-
45 if Flag.only_js flags
46 then do putStr "Generating JavaScript ... "
47 return ("js", js)
48 else do putStr "Generating HTML ... "
49 makeHtml js moduleName
51 let targetFile = Utils.buildPath flags rootFile extension
52 createDirectoryIfMissing True (takeDirectory targetFile)
53 BS.writeFile targetFile code
54 putStrLn "Done"
56 where
57 appendToOutput :: BS.ByteString -> FilePath -> IO BS.ByteString
58 appendToOutput js filePath = do
59 src <- BS.readFile (Utils.elmo flags filePath)
60 return (BS.append src js)
62 sources js = map Html.Link (Flag.scripts flags) ++ [ Html.Source js ]
64 makeHtml js moduleName = do
65 rtsPath <- case Flag.runtime flags of
66 Just fp -> return fp
67 Nothing -> Info.runtime
69 let html = Html.generate
70 rtsPath (takeBaseName rootFile) (sources js) moduleName ""
71 return ("html", Blaze.renderHtml html)