2012-04-19 06:32:10 +00:00
|
|
|
module Main where
|
|
|
|
|
2013-12-15 07:29:39 +00:00
|
|
|
import Control.Monad (foldM)
|
|
|
|
import qualified Data.Map as Map
|
2013-12-17 19:36:05 +00:00
|
|
|
import qualified Data.Maybe as Maybe
|
2013-12-15 07:29:39 +00:00
|
|
|
import qualified Text.Blaze.Html.Renderer.Utf8 as Blaze
|
|
|
|
import qualified Data.ByteString.Lazy.Char8 as BS
|
|
|
|
import qualified System.Console.CmdArgs as CmdArgs
|
|
|
|
import System.Directory
|
|
|
|
import System.FilePath
|
2013-08-03 05:20:55 +00:00
|
|
|
import GHC.Conc
|
2013-12-15 07:29:39 +00:00
|
|
|
|
|
|
|
import Build.Dependencies (getSortedDependencies)
|
|
|
|
import qualified Generate.Html as Html
|
|
|
|
import qualified Metadata.Prelude as Prelude
|
|
|
|
import qualified Build.Utils as Utils
|
|
|
|
import qualified Build.Flags as Flag
|
|
|
|
import qualified Build.File as File
|
2013-12-17 19:36:05 +00:00
|
|
|
import qualified Elm.Internal.Paths as Path
|
2013-06-05 07:44:04 +00:00
|
|
|
|
2013-10-29 16:22:33 +00:00
|
|
|
main :: IO ()
|
2013-08-03 05:20:55 +00:00
|
|
|
main = do setNumCapabilities =<< getNumProcessors
|
2013-12-15 07:29:39 +00:00
|
|
|
compileArgs =<< CmdArgs.cmdArgs Flag.flags
|
2013-06-05 07:44:04 +00:00
|
|
|
|
2013-12-15 07:29:39 +00:00
|
|
|
compileArgs :: Flag.Flags -> IO ()
|
2013-06-05 07:44:04 +00:00
|
|
|
compileArgs flags =
|
2013-12-15 07:29:39 +00:00
|
|
|
case Flag.files flags of
|
2013-06-05 21:22:30 +00:00
|
|
|
[] -> putStrLn "Usage: elm [OPTIONS] [FILES]\nFor more help: elm --help"
|
|
|
|
fs -> mapM_ (build flags) fs
|
2013-12-15 07:29:39 +00:00
|
|
|
|
|
|
|
build :: Flag.Flags -> FilePath -> IO ()
|
|
|
|
build flags rootFile =
|
|
|
|
do let noPrelude = Flag.no_prelude flags
|
|
|
|
builtIns <- if noPrelude then return Map.empty else Prelude.interfaces
|
|
|
|
|
|
|
|
files <- if Flag.make flags
|
|
|
|
then getSortedDependencies (Flag.src_dir flags) builtIns rootFile
|
|
|
|
else return [rootFile]
|
|
|
|
|
|
|
|
(moduleName, interfaces) <-
|
|
|
|
File.build flags (length files) builtIns "" files
|
|
|
|
|
|
|
|
js <- foldM appendToOutput BS.empty files
|
|
|
|
|
|
|
|
(extension, code) <-
|
|
|
|
if Flag.only_js flags
|
|
|
|
then do putStr "Generating JavaScript ... "
|
|
|
|
return ("js", js)
|
|
|
|
else do putStr "Generating HTML ... "
|
2013-12-17 19:36:05 +00:00
|
|
|
return (makeHtml js moduleName)
|
2013-12-15 07:29:39 +00:00
|
|
|
|
|
|
|
let targetFile = Utils.buildPath flags rootFile extension
|
|
|
|
createDirectoryIfMissing True (takeDirectory targetFile)
|
|
|
|
BS.writeFile targetFile code
|
|
|
|
putStrLn "Done"
|
|
|
|
|
|
|
|
where
|
|
|
|
appendToOutput :: BS.ByteString -> FilePath -> IO BS.ByteString
|
|
|
|
appendToOutput js filePath = do
|
|
|
|
src <- BS.readFile (Utils.elmo flags filePath)
|
|
|
|
return (BS.append src js)
|
|
|
|
|
|
|
|
sources js = map Html.Link (Flag.scripts flags) ++ [ Html.Source js ]
|
|
|
|
|
2013-12-17 19:36:05 +00:00
|
|
|
makeHtml js moduleName = ("html", Blaze.renderHtml html)
|
|
|
|
where
|
|
|
|
rtsPath = Maybe.fromMaybe Path.runtime (Flag.runtime flags)
|
|
|
|
html = Html.generate rtsPath (takeBaseName rootFile) (sources js) moduleName ""
|