b9e627f78e
Tested on small file where I changed a dependency and on elm-lang.org code.
67 lines
2.3 KiB
Haskell
67 lines
2.3 KiB
Haskell
{-# OPTIONS_GHC -W #-}
|
|
module Main where
|
|
|
|
import Control.Monad (foldM)
|
|
import qualified Data.Maybe as Maybe
|
|
import Text.Blaze.Html.Renderer.String (renderHtml)
|
|
import qualified Data.ByteString.Lazy.Char8 as BS
|
|
import qualified System.Console.CmdArgs as CmdArgs
|
|
import System.Directory
|
|
import System.FilePath
|
|
import GHC.Conc
|
|
|
|
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
|
|
import qualified Elm.Internal.Paths as Path
|
|
|
|
main :: IO ()
|
|
main = do setNumCapabilities =<< getNumProcessors
|
|
compileArgs =<< CmdArgs.cmdArgs Flag.flags
|
|
|
|
compileArgs :: Flag.Flags -> IO ()
|
|
compileArgs flags =
|
|
case Flag.files flags of
|
|
[] -> putStrLn "Usage: elm [OPTIONS] [FILES]\nFor more help: elm --help"
|
|
fs -> mapM_ (build flags) fs
|
|
|
|
build :: Flag.Flags -> FilePath -> IO ()
|
|
build flags rootFile =
|
|
do let noPrelude = Flag.no_prelude flags
|
|
builtIns <- Prelude.interfaces noPrelude
|
|
|
|
files <- if Flag.make flags
|
|
then getSortedDependencies (Flag.src_dir flags) builtIns rootFile
|
|
else return [rootFile]
|
|
|
|
moduleName <- File.build flags 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 ... "
|
|
return (makeHtml js moduleName)
|
|
|
|
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 ]
|
|
|
|
makeHtml js moduleName = ("html", BS.pack $ renderHtml html)
|
|
where
|
|
rtsPath = Maybe.fromMaybe Path.runtime (Flag.runtime flags)
|
|
html = Html.generate rtsPath (takeBaseName rootFile) (sources js) moduleName ""
|