module Data.Makefile.Render.Internal where
import Data.Makefile
import Data.Monoid
import qualified Data.ByteString.Lazy as B
import Data.ByteString.Builder
import qualified Data.ByteString.Lazy.Char8 as BL
writeMakefile :: FilePath -> Makefile -> IO ()
writeMakefile f m = do
let s = encodeMakefile m
BL.writeFile f s
encodeMakefile :: Makefile -> B.ByteString
encodeMakefile = toLazyByteString . renderMakefile
renderMakefile :: Makefile -> Builder
renderMakefile (Makefile es ) = mconcat [renderEntry e <> charUtf8 '\n' | e <- es]
renderEntry :: Entry -> Builder
renderEntry (Assignment key value ) = byteString key <> charUtf8 '=' <> byteString value
renderEntry (Rule (Target t) ds cmds) =
byteString t <> charUtf8 ':' <>
mconcat [charUtf8 ' ' <> renderDep d | d <- ds] <>
charUtf8 '\n' <>
mconcat [renderCmd cmd <> charUtf8 '\n' | cmd <- cmds]
renderDep :: Dependency -> Builder
renderDep (Dependency dep ) = byteString dep
renderCmd :: Command -> Builder
renderCmd (Command cmd ) = charUtf8 '\t' <> byteString cmd