{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}

module Distribution.Types.BuildInfo
  ( BuildInfo (..)
  , emptyBuildInfo
  , allLanguages
  , allExtensions
  , usedExtensions
  , usesTemplateHaskellOrQQ
  , hcOptions
  , hcProfOptions
  , hcSharedOptions
  , hcStaticOptions
  ) where

import Distribution.Compat.Prelude
import Prelude ()

import Distribution.Types.Dependency
import Distribution.Types.ExeDependency
import Distribution.Types.LegacyExeDependency
import Distribution.Types.Mixin
import Distribution.Types.PkgconfigDependency
import Distribution.Utils.Path

import Distribution.Compiler
import Distribution.ModuleName
import Language.Haskell.Extension

-- Consider refactoring into executable and library versions.
data BuildInfo = BuildInfo
  { BuildInfo -> Bool
buildable :: Bool
  -- ^ component is buildable here
  , BuildInfo -> [LegacyExeDependency]
buildTools :: [LegacyExeDependency]
  -- ^ Tools needed to build this bit.
  --
  -- This is a legacy field that 'buildToolDepends' largely supersedes.
  --
  -- Unless use are very sure what you are doing, use the functions in
  -- "Distribution.Simple.BuildToolDepends" rather than accessing this
  -- field directly.
  , BuildInfo -> [ExeDependency]
buildToolDepends :: [ExeDependency]
  -- ^ Haskell tools needed to build this bit
  --
  -- This field is better than 'buildTools' because it allows one to
  -- precisely specify an executable in a package.
  --
  -- Unless use are very sure what you are doing, use the functions in
  -- "Distribution.Simple.BuildToolDepends" rather than accessing this
  -- field directly.
  , BuildInfo -> [String]
cppOptions :: [String]
  -- ^ options for pre-processing Haskell code
  , BuildInfo -> [String]
asmOptions :: [String]
  -- ^ options for assembler
  , BuildInfo -> [String]
cmmOptions :: [String]
  -- ^ options for C-- compiler
  , BuildInfo -> [String]
ccOptions :: [String]
  -- ^ options for C compiler
  , BuildInfo -> [String]
cxxOptions :: [String]
  -- ^ options for C++ compiler
  , BuildInfo -> [String]
ldOptions :: [String]
  -- ^ options for linker
  , BuildInfo -> [String]
hsc2hsOptions :: [String]
  -- ^ options for hsc2hs
  , BuildInfo -> [PkgconfigDependency]
pkgconfigDepends :: [PkgconfigDependency]
  -- ^ pkg-config packages that are used
  , BuildInfo -> [String]
frameworks :: [String]
  -- ^ support frameworks for Mac OS X
  , BuildInfo -> [String]
extraFrameworkDirs :: [String]
  -- ^ extra locations to find frameworks.
  , BuildInfo -> [String]
asmSources :: [FilePath]
  -- ^ Assembly files.
  , BuildInfo -> [String]
cmmSources :: [FilePath]
  -- ^ C-- files.
  , BuildInfo -> [String]
cSources :: [FilePath]
  , BuildInfo -> [String]
cxxSources :: [FilePath]
  , BuildInfo -> [String]
jsSources :: [FilePath]
  , BuildInfo -> [SymbolicPath PackageDir SourceDir]
hsSourceDirs :: [SymbolicPath PackageDir SourceDir]
  -- ^ where to look for the Haskell module hierarchy
  , BuildInfo -> [ModuleName]
otherModules :: [ModuleName]
  -- ^ non-exposed or non-main modules
  , BuildInfo -> [ModuleName]
virtualModules :: [ModuleName]
  -- ^ exposed modules that do not have a source file (e.g. @GHC.Prim@ from @ghc-prim@ package)
  , BuildInfo -> [ModuleName]
autogenModules :: [ModuleName]
  -- ^ not present on sdist, Paths_* or user-generated with a custom Setup.hs
  , BuildInfo -> Maybe Language
defaultLanguage :: Maybe Language
  -- ^ language used when not explicitly specified
  , BuildInfo -> [Language]
otherLanguages :: [Language]
  -- ^ other languages used within the package
  , BuildInfo -> [Extension]
defaultExtensions :: [Extension]
  -- ^ language extensions used by all modules
  , BuildInfo -> [Extension]
otherExtensions :: [Extension]
  -- ^ other language extensions used within the package
  , BuildInfo -> [Extension]
oldExtensions :: [Extension]
  -- ^ the old extensions field, treated same as 'defaultExtensions'
  , BuildInfo -> [String]
extraLibs :: [String]
  -- ^ what libraries to link with when compiling a program that uses your package
  , BuildInfo -> [String]
extraLibsStatic :: [String]
  -- ^ what libraries to link with when compiling a program fully statically that uses your package
  , BuildInfo -> [String]
extraGHCiLibs :: [String]
  -- ^ if present, overrides extraLibs when package is loaded with GHCi.
  , BuildInfo -> [String]
extraBundledLibs :: [String]
  -- ^ if present, adds libs to hs-libraries, which become part of the package.
  --   Example 1: the Cffi library shipping with the rts, alongside the HSrts-1.0.a,.o,...
  --   Example 2: a library that is being built by a foreign tool (e.g. rust)
  --              and copied and registered together with this library.  The
  --              logic on how this library is built will have to be encoded in a
  --              custom Setup for now.  Otherwise cabal would need to learn how to
  --              call arbitrary library builders.
  , BuildInfo -> [String]
extraLibFlavours :: [String]
  -- ^ Hidden Flag.  This set of strings, will be appended to all libraries when
  --   copying. E.g. [libHS<name>_<flavour> | flavour <- extraLibFlavours]. This
  --   should only be needed in very specific cases, e.g. the `rts` package, where
  --   there are multiple copies of slightly differently built libs.
  , BuildInfo -> [String]
extraDynLibFlavours :: [String]
  -- ^ Hidden Flag. This set of strings will be appended to all /dynamic/
  --   libraries when copying. This is particularly useful with the `rts` package,
  --   where we want different dynamic flavours of the RTS library to be installed.
  , BuildInfo -> [String]
extraLibDirs :: [String]
  , BuildInfo -> [String]
extraLibDirsStatic :: [String]
  , BuildInfo -> [String]
includeDirs :: [FilePath]
  -- ^ directories to find .h files
  , BuildInfo -> [String]
includes :: [FilePath]
  -- ^ The .h files to be found in includeDirs
  , BuildInfo -> [String]
autogenIncludes :: [FilePath]
  -- ^ The .h files to be generated (e.g. by @autoconf@)
  , BuildInfo -> [String]
installIncludes :: [FilePath]
  -- ^ .h files to install with the package
  , BuildInfo -> PerCompilerFlavor [String]
options :: PerCompilerFlavor [String]
  , BuildInfo -> PerCompilerFlavor [String]
profOptions :: PerCompilerFlavor [String]
  , BuildInfo -> PerCompilerFlavor [String]
sharedOptions :: PerCompilerFlavor [String]
  , BuildInfo -> PerCompilerFlavor [String]
staticOptions :: PerCompilerFlavor [String]
  , BuildInfo -> [(String, String)]
customFieldsBI :: [(String, String)]
  -- ^ Custom fields starting
  --  with x-, stored in a
  --  simple assoc-list.
  , BuildInfo -> [Dependency]
targetBuildDepends :: [Dependency]
  -- ^ Dependencies specific to a library or executable target
  , BuildInfo -> [Mixin]
mixins :: [Mixin]
  }
  deriving ((forall x. BuildInfo -> Rep BuildInfo x)
-> (forall x. Rep BuildInfo x -> BuildInfo) -> Generic BuildInfo
forall x. Rep BuildInfo x -> BuildInfo
forall x. BuildInfo -> Rep BuildInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BuildInfo -> Rep BuildInfo x
from :: forall x. BuildInfo -> Rep BuildInfo x
$cto :: forall x. Rep BuildInfo x -> BuildInfo
to :: forall x. Rep BuildInfo x -> BuildInfo
Generic, Int -> BuildInfo -> ShowS
[BuildInfo] -> ShowS
BuildInfo -> String
(Int -> BuildInfo -> ShowS)
-> (BuildInfo -> String)
-> ([BuildInfo] -> ShowS)
-> Show BuildInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildInfo -> ShowS
showsPrec :: Int -> BuildInfo -> ShowS
$cshow :: BuildInfo -> String
show :: BuildInfo -> String
$cshowList :: [BuildInfo] -> ShowS
showList :: [BuildInfo] -> ShowS
Show, ReadPrec [BuildInfo]
ReadPrec BuildInfo
Int -> ReadS BuildInfo
ReadS [BuildInfo]
(Int -> ReadS BuildInfo)
-> ReadS [BuildInfo]
-> ReadPrec BuildInfo
-> ReadPrec [BuildInfo]
-> Read BuildInfo
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS BuildInfo
readsPrec :: Int -> ReadS BuildInfo
$creadList :: ReadS [BuildInfo]
readList :: ReadS [BuildInfo]
$creadPrec :: ReadPrec BuildInfo
readPrec :: ReadPrec BuildInfo
$creadListPrec :: ReadPrec [BuildInfo]
readListPrec :: ReadPrec [BuildInfo]
Read, BuildInfo -> BuildInfo -> Bool
(BuildInfo -> BuildInfo -> Bool)
-> (BuildInfo -> BuildInfo -> Bool) -> Eq BuildInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildInfo -> BuildInfo -> Bool
== :: BuildInfo -> BuildInfo -> Bool
$c/= :: BuildInfo -> BuildInfo -> Bool
/= :: BuildInfo -> BuildInfo -> Bool
Eq, Eq BuildInfo
Eq BuildInfo =>
(BuildInfo -> BuildInfo -> Ordering)
-> (BuildInfo -> BuildInfo -> Bool)
-> (BuildInfo -> BuildInfo -> Bool)
-> (BuildInfo -> BuildInfo -> Bool)
-> (BuildInfo -> BuildInfo -> Bool)
-> (BuildInfo -> BuildInfo -> BuildInfo)
-> (BuildInfo -> BuildInfo -> BuildInfo)
-> Ord BuildInfo
BuildInfo -> BuildInfo -> Bool
BuildInfo -> BuildInfo -> Ordering
BuildInfo -> BuildInfo -> BuildInfo
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: BuildInfo -> BuildInfo -> Ordering
compare :: BuildInfo -> BuildInfo -> Ordering
$c< :: BuildInfo -> BuildInfo -> Bool
< :: BuildInfo -> BuildInfo -> Bool
$c<= :: BuildInfo -> BuildInfo -> Bool
<= :: BuildInfo -> BuildInfo -> Bool
$c> :: BuildInfo -> BuildInfo -> Bool
> :: BuildInfo -> BuildInfo -> Bool
$c>= :: BuildInfo -> BuildInfo -> Bool
>= :: BuildInfo -> BuildInfo -> Bool
$cmax :: BuildInfo -> BuildInfo -> BuildInfo
max :: BuildInfo -> BuildInfo -> BuildInfo
$cmin :: BuildInfo -> BuildInfo -> BuildInfo
min :: BuildInfo -> BuildInfo -> BuildInfo
Ord, Typeable, Typeable BuildInfo
Typeable BuildInfo =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> BuildInfo -> c BuildInfo)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c BuildInfo)
-> (BuildInfo -> Constr)
-> (BuildInfo -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c BuildInfo))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c BuildInfo))
-> ((forall b. Data b => b -> b) -> BuildInfo -> BuildInfo)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> BuildInfo -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> BuildInfo -> r)
-> (forall u. (forall d. Data d => d -> u) -> BuildInfo -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> BuildInfo -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo)
-> Data BuildInfo
BuildInfo -> Constr
BuildInfo -> DataType
(forall b. Data b => b -> b) -> BuildInfo -> BuildInfo
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> BuildInfo -> u
forall u. (forall d. Data d => d -> u) -> BuildInfo -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> BuildInfo -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> BuildInfo -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c BuildInfo
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> BuildInfo -> c BuildInfo
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c BuildInfo)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c BuildInfo)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> BuildInfo -> c BuildInfo
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> BuildInfo -> c BuildInfo
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c BuildInfo
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c BuildInfo
$ctoConstr :: BuildInfo -> Constr
toConstr :: BuildInfo -> Constr
$cdataTypeOf :: BuildInfo -> DataType
dataTypeOf :: BuildInfo -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c BuildInfo)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c BuildInfo)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c BuildInfo)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c BuildInfo)
$cgmapT :: (forall b. Data b => b -> b) -> BuildInfo -> BuildInfo
gmapT :: (forall b. Data b => b -> b) -> BuildInfo -> BuildInfo
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> BuildInfo -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> BuildInfo -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> BuildInfo -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> BuildInfo -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> BuildInfo -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> BuildInfo -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> BuildInfo -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> BuildInfo -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> BuildInfo -> m BuildInfo
Data)

instance Binary BuildInfo
instance Structured BuildInfo
instance NFData BuildInfo where rnf :: BuildInfo -> ()
rnf = BuildInfo -> ()
forall a. (Generic a, GNFData (Rep a)) => a -> ()
genericRnf

instance Monoid BuildInfo where
  mempty :: BuildInfo
mempty =
    BuildInfo
      { buildable :: Bool
buildable = Bool
True
      , buildTools :: [LegacyExeDependency]
buildTools = []
      , buildToolDepends :: [ExeDependency]
buildToolDepends = []
      , cppOptions :: [String]
cppOptions = []
      , asmOptions :: [String]
asmOptions = []
      , cmmOptions :: [String]
cmmOptions = []
      , ccOptions :: [String]
ccOptions = []
      , cxxOptions :: [String]
cxxOptions = []
      , ldOptions :: [String]
ldOptions = []
      , hsc2hsOptions :: [String]
hsc2hsOptions = []
      , pkgconfigDepends :: [PkgconfigDependency]
pkgconfigDepends = []
      , frameworks :: [String]
frameworks = []
      , extraFrameworkDirs :: [String]
extraFrameworkDirs = []
      , asmSources :: [String]
asmSources = []
      , cmmSources :: [String]
cmmSources = []
      , cSources :: [String]
cSources = []
      , cxxSources :: [String]
cxxSources = []
      , jsSources :: [String]
jsSources = []
      , hsSourceDirs :: [SymbolicPath PackageDir SourceDir]
hsSourceDirs = []
      , otherModules :: [ModuleName]
otherModules = []
      , virtualModules :: [ModuleName]
virtualModules = []
      , autogenModules :: [ModuleName]
autogenModules = []
      , defaultLanguage :: Maybe Language
defaultLanguage = Maybe Language
forall a. Maybe a
Nothing
      , otherLanguages :: [Language]
otherLanguages = []
      , defaultExtensions :: [Extension]
defaultExtensions = []
      , otherExtensions :: [Extension]
otherExtensions = []
      , oldExtensions :: [Extension]
oldExtensions = []
      , extraLibs :: [String]
extraLibs = []
      , extraLibsStatic :: [String]
extraLibsStatic = []
      , extraGHCiLibs :: [String]
extraGHCiLibs = []
      , extraBundledLibs :: [String]
extraBundledLibs = []
      , extraLibFlavours :: [String]
extraLibFlavours = []
      , extraDynLibFlavours :: [String]
extraDynLibFlavours = []
      , extraLibDirs :: [String]
extraLibDirs = []
      , extraLibDirsStatic :: [String]
extraLibDirsStatic = []
      , includeDirs :: [String]
includeDirs = []
      , includes :: [String]
includes = []
      , autogenIncludes :: [String]
autogenIncludes = []
      , installIncludes :: [String]
installIncludes = []
      , options :: PerCompilerFlavor [String]
options = PerCompilerFlavor [String]
forall a. Monoid a => a
mempty
      , profOptions :: PerCompilerFlavor [String]
profOptions = PerCompilerFlavor [String]
forall a. Monoid a => a
mempty
      , sharedOptions :: PerCompilerFlavor [String]
sharedOptions = PerCompilerFlavor [String]
forall a. Monoid a => a
mempty
      , staticOptions :: PerCompilerFlavor [String]
staticOptions = PerCompilerFlavor [String]
forall a. Monoid a => a
mempty
      , customFieldsBI :: [(String, String)]
customFieldsBI = []
      , targetBuildDepends :: [Dependency]
targetBuildDepends = []
      , mixins :: [Mixin]
mixins = []
      }
  mappend :: BuildInfo -> BuildInfo -> BuildInfo
mappend = BuildInfo -> BuildInfo -> BuildInfo
forall a. Semigroup a => a -> a -> a
(<>)

instance Semigroup BuildInfo where
  BuildInfo
a <> :: BuildInfo -> BuildInfo -> BuildInfo
<> BuildInfo
b =
    BuildInfo
      { buildable :: Bool
buildable = BuildInfo -> Bool
buildable BuildInfo
a Bool -> Bool -> Bool
&& BuildInfo -> Bool
buildable BuildInfo
b
      , buildTools :: [LegacyExeDependency]
buildTools = (BuildInfo -> [LegacyExeDependency]) -> [LegacyExeDependency]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [LegacyExeDependency]
buildTools
      , buildToolDepends :: [ExeDependency]
buildToolDepends = (BuildInfo -> [ExeDependency]) -> [ExeDependency]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [ExeDependency]
buildToolDepends
      , cppOptions :: [String]
cppOptions = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
cppOptions
      , asmOptions :: [String]
asmOptions = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
asmOptions
      , cmmOptions :: [String]
cmmOptions = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
cmmOptions
      , ccOptions :: [String]
ccOptions = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
ccOptions
      , cxxOptions :: [String]
cxxOptions = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
cxxOptions
      , ldOptions :: [String]
ldOptions = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
ldOptions
      , hsc2hsOptions :: [String]
hsc2hsOptions = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
hsc2hsOptions
      , pkgconfigDepends :: [PkgconfigDependency]
pkgconfigDepends = (BuildInfo -> [PkgconfigDependency]) -> [PkgconfigDependency]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [PkgconfigDependency]
pkgconfigDepends
      , frameworks :: [String]
frameworks = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
frameworks
      , extraFrameworkDirs :: [String]
extraFrameworkDirs = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
extraFrameworkDirs
      , asmSources :: [String]
asmSources = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
asmSources
      , cmmSources :: [String]
cmmSources = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
cmmSources
      , cSources :: [String]
cSources = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
cSources
      , cxxSources :: [String]
cxxSources = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
cxxSources
      , jsSources :: [String]
jsSources = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
jsSources
      , hsSourceDirs :: [SymbolicPath PackageDir SourceDir]
hsSourceDirs = (BuildInfo -> [SymbolicPath PackageDir SourceDir])
-> [SymbolicPath PackageDir SourceDir]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [SymbolicPath PackageDir SourceDir]
hsSourceDirs
      , otherModules :: [ModuleName]
otherModules = (BuildInfo -> [ModuleName]) -> [ModuleName]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [ModuleName]
otherModules
      , virtualModules :: [ModuleName]
virtualModules = (BuildInfo -> [ModuleName]) -> [ModuleName]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [ModuleName]
virtualModules
      , autogenModules :: [ModuleName]
autogenModules = (BuildInfo -> [ModuleName]) -> [ModuleName]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [ModuleName]
autogenModules
      , defaultLanguage :: Maybe Language
defaultLanguage = (BuildInfo -> Maybe Language) -> Maybe Language
forall {m :: * -> *} {a}. MonadPlus m => (BuildInfo -> m a) -> m a
combineMby BuildInfo -> Maybe Language
defaultLanguage
      , otherLanguages :: [Language]
otherLanguages = (BuildInfo -> [Language]) -> [Language]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [Language]
otherLanguages
      , defaultExtensions :: [Extension]
defaultExtensions = (BuildInfo -> [Extension]) -> [Extension]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [Extension]
defaultExtensions
      , otherExtensions :: [Extension]
otherExtensions = (BuildInfo -> [Extension]) -> [Extension]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [Extension]
otherExtensions
      , oldExtensions :: [Extension]
oldExtensions = (BuildInfo -> [Extension]) -> [Extension]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [Extension]
oldExtensions
      , extraLibs :: [String]
extraLibs = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
extraLibs
      , extraLibsStatic :: [String]
extraLibsStatic = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
extraLibsStatic
      , extraGHCiLibs :: [String]
extraGHCiLibs = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
extraGHCiLibs
      , extraBundledLibs :: [String]
extraBundledLibs = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
extraBundledLibs
      , extraLibFlavours :: [String]
extraLibFlavours = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
extraLibFlavours
      , extraDynLibFlavours :: [String]
extraDynLibFlavours = (BuildInfo -> [String]) -> [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [String]
extraDynLibFlavours
      , extraLibDirs :: [String]
extraLibDirs = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
extraLibDirs
      , extraLibDirsStatic :: [String]
extraLibDirsStatic = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
extraLibDirsStatic
      , includeDirs :: [String]
includeDirs = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
includeDirs
      , includes :: [String]
includes = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
includes
      , autogenIncludes :: [String]
autogenIncludes = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
autogenIncludes
      , installIncludes :: [String]
installIncludes = (BuildInfo -> [String]) -> [String]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [String]
installIncludes
      , options :: PerCompilerFlavor [String]
options = (BuildInfo -> PerCompilerFlavor [String])
-> PerCompilerFlavor [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> PerCompilerFlavor [String]
options
      , profOptions :: PerCompilerFlavor [String]
profOptions = (BuildInfo -> PerCompilerFlavor [String])
-> PerCompilerFlavor [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> PerCompilerFlavor [String]
profOptions
      , sharedOptions :: PerCompilerFlavor [String]
sharedOptions = (BuildInfo -> PerCompilerFlavor [String])
-> PerCompilerFlavor [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> PerCompilerFlavor [String]
sharedOptions
      , staticOptions :: PerCompilerFlavor [String]
staticOptions = (BuildInfo -> PerCompilerFlavor [String])
-> PerCompilerFlavor [String]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> PerCompilerFlavor [String]
staticOptions
      , customFieldsBI :: [(String, String)]
customFieldsBI = (BuildInfo -> [(String, String)]) -> [(String, String)]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [(String, String)]
customFieldsBI
      , targetBuildDepends :: [Dependency]
targetBuildDepends = (BuildInfo -> [Dependency]) -> [Dependency]
forall {a}. Eq a => (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [Dependency]
targetBuildDepends
      , mixins :: [Mixin]
mixins = (BuildInfo -> [Mixin]) -> [Mixin]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [Mixin]
mixins
      }
    where
      combine :: (BuildInfo -> a) -> a
combine BuildInfo -> a
field = BuildInfo -> a
field BuildInfo
a a -> a -> a
forall a. Monoid a => a -> a -> a
`mappend` BuildInfo -> a
field BuildInfo
b
      combineNub :: (BuildInfo -> [a]) -> [a]
combineNub BuildInfo -> [a]
field = [a] -> [a]
forall a. Eq a => [a] -> [a]
nub ((BuildInfo -> [a]) -> [a]
forall {a}. Monoid a => (BuildInfo -> a) -> a
combine BuildInfo -> [a]
field)
      combineMby :: (BuildInfo -> m a) -> m a
combineMby BuildInfo -> m a
field = BuildInfo -> m a
field BuildInfo
b m a -> m a -> m a
forall a. m a -> m a -> m a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` BuildInfo -> m a
field BuildInfo
a

emptyBuildInfo :: BuildInfo
emptyBuildInfo :: BuildInfo
emptyBuildInfo = BuildInfo
forall a. Monoid a => a
mempty

-- | The 'Language's used by this component
allLanguages :: BuildInfo -> [Language]
allLanguages :: BuildInfo -> [Language]
allLanguages BuildInfo
bi =
  Maybe Language -> [Language]
forall a. Maybe a -> [a]
maybeToList (BuildInfo -> Maybe Language
defaultLanguage BuildInfo
bi)
    [Language] -> [Language] -> [Language]
forall a. [a] -> [a] -> [a]
++ BuildInfo -> [Language]
otherLanguages BuildInfo
bi

-- | The 'Extension's that are used somewhere by this component
allExtensions :: BuildInfo -> [Extension]
allExtensions :: BuildInfo -> [Extension]
allExtensions BuildInfo
bi =
  BuildInfo -> [Extension]
usedExtensions BuildInfo
bi
    [Extension] -> [Extension] -> [Extension]
forall a. [a] -> [a] -> [a]
++ BuildInfo -> [Extension]
otherExtensions BuildInfo
bi

-- | The 'Extensions' that are used by all modules in this component
usedExtensions :: BuildInfo -> [Extension]
usedExtensions :: BuildInfo -> [Extension]
usedExtensions BuildInfo
bi =
  BuildInfo -> [Extension]
oldExtensions BuildInfo
bi
    [Extension] -> [Extension] -> [Extension]
forall a. [a] -> [a] -> [a]
++ BuildInfo -> [Extension]
defaultExtensions BuildInfo
bi

-- | Whether any modules in this component use Template Haskell or
-- Quasi Quotes
usesTemplateHaskellOrQQ :: BuildInfo -> Bool
usesTemplateHaskellOrQQ :: BuildInfo -> Bool
usesTemplateHaskellOrQQ BuildInfo
bi = (Extension -> Bool) -> [Extension] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Extension -> Bool
p (BuildInfo -> [Extension]
allExtensions BuildInfo
bi)
  where
    p :: Extension -> Bool
p Extension
ex =
      Extension
ex
        Extension -> [Extension] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [KnownExtension -> Extension
EnableExtension KnownExtension
TemplateHaskell, KnownExtension -> Extension
EnableExtension KnownExtension
QuasiQuotes]

-- | Select options for a particular Haskell compiler.
hcOptions :: CompilerFlavor -> BuildInfo -> [String]
hcOptions :: CompilerFlavor -> BuildInfo -> [String]
hcOptions = (BuildInfo -> PerCompilerFlavor [String])
-> CompilerFlavor -> BuildInfo -> [String]
lookupHcOptions BuildInfo -> PerCompilerFlavor [String]
options

hcProfOptions :: CompilerFlavor -> BuildInfo -> [String]
hcProfOptions :: CompilerFlavor -> BuildInfo -> [String]
hcProfOptions = (BuildInfo -> PerCompilerFlavor [String])
-> CompilerFlavor -> BuildInfo -> [String]
lookupHcOptions BuildInfo -> PerCompilerFlavor [String]
profOptions

hcSharedOptions :: CompilerFlavor -> BuildInfo -> [String]
hcSharedOptions :: CompilerFlavor -> BuildInfo -> [String]
hcSharedOptions = (BuildInfo -> PerCompilerFlavor [String])
-> CompilerFlavor -> BuildInfo -> [String]
lookupHcOptions BuildInfo -> PerCompilerFlavor [String]
sharedOptions

hcStaticOptions :: CompilerFlavor -> BuildInfo -> [String]
hcStaticOptions :: CompilerFlavor -> BuildInfo -> [String]
hcStaticOptions = (BuildInfo -> PerCompilerFlavor [String])
-> CompilerFlavor -> BuildInfo -> [String]
lookupHcOptions BuildInfo -> PerCompilerFlavor [String]
staticOptions

lookupHcOptions
  :: (BuildInfo -> PerCompilerFlavor [String])
  -> CompilerFlavor
  -> BuildInfo
  -> [String]
lookupHcOptions :: (BuildInfo -> PerCompilerFlavor [String])
-> CompilerFlavor -> BuildInfo -> [String]
lookupHcOptions BuildInfo -> PerCompilerFlavor [String]
f CompilerFlavor
hc BuildInfo
bi = case BuildInfo -> PerCompilerFlavor [String]
f BuildInfo
bi of
  PerCompilerFlavor [String]
ghc [String]
ghcjs
    | CompilerFlavor
hc CompilerFlavor -> CompilerFlavor -> Bool
forall a. Eq a => a -> a -> Bool
== CompilerFlavor
GHC -> [String]
ghc
    | CompilerFlavor
hc CompilerFlavor -> CompilerFlavor -> Bool
forall a. Eq a => a -> a -> Bool
== CompilerFlavor
GHCJS -> [String]
ghcjs
    | Bool
otherwise -> [String]
forall a. Monoid a => a
mempty