{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-| Module : Data.Makefile Copyright : (c) 2016 Nicolas Mattia License : MIT Maintainer : Nicolas Mattia Stability : experimental This module defines the different types used when working with a Makefile. @ # File: Makefile hello = world foo: bar baz @ @ Makefile { entries = [ Assignment RecursiveAssign "hello" "world" , Rule (Target "foo") [Dependency "bar"] [Command "baz"] ] } @ -} module Data.Makefile where import Data.String (IsString) import qualified Data.Text as T -- | A Makefile object, a list of makefile entries data Makefile = Makefile { entries :: [Entry] } deriving (Show, Eq) -- | A makefile entry, either a rule @(target: dep1 dep1; commands)@ or a -- variable assignment (@hello = world@ or @hello := world@) data Entry = Rule Target [Dependency] [Command] | Assignment AssignmentType T.Text T.Text deriving (Show, Eq) data AssignmentType = RecursiveAssign -- ^ foo = bar | SimpleAssign -- ^ foo := bar | SimplePosixAssign -- ^ foo ::= bar | ConditionalAssign -- ^ foo ?= bar | ShellAssign -- ^ foo != bar | AppendAssign -- ^ foo += bar deriving (Show, Eq, Enum, Bounded) -- | Makefile target (@foo@ in the example above) newtype Target = Target T.Text deriving (Show, Eq, IsString) -- | Target dependency (@bar@ in the example above) newtype Dependency = Dependency T.Text deriving (Show, Eq, IsString) -- | Command (@baz@ in the example above) newtype Command = Command T.Text deriving (Show, Eq, IsString)