{-# LANGUAGE DeriveDataTypeable, CPP #-}

module CabalCargs.Args
   ( Args(..)
   , get
   ) where

import System.Console.CmdArgs hiding (ignore)
import CabalCargs.Fields (Field)
import CabalCargs.Formatting (Formatting)
 
#ifdef CABAL
import Data.Version (showVersion)
import Paths_cabal_cargs (version)
#endif


-- | The command line arguments of the cabal-cargs command.
data Args = Args
   { Args -> Bool
library     :: Bool
   , Args -> [String]
executable  :: [String]
   , Args -> [String]
testSuite   :: [String]
   , Args -> [String]
benchmark   :: [String]
   , Args -> Bool
allSections :: Bool
   , Args -> [Field]
only        :: [Field]
   , Args -> [Field]
ignore      :: [Field]
   , Args -> Formatting
format      :: Formatting
   , Args -> Maybe String
sourceFile  :: Maybe FilePath
   , Args -> Maybe String
cabalFile   :: Maybe FilePath
   , Args -> [String]
enable      :: [String]
   , Args -> [String]
disable     :: [String]
   , Args -> Maybe String
os          :: Maybe String
   , Args -> Maybe String
arch        :: Maybe String
   , Args -> Bool
relative    :: Bool
   }
   deriving (Typeable Args
Typeable Args =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> Args -> c Args)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Args)
-> (Args -> Constr)
-> (Args -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Args))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Args))
-> ((forall b. Data b => b -> b) -> Args -> Args)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Args -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Args -> r)
-> (forall u. (forall d. Data d => d -> u) -> Args -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Args -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Args -> m Args)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Args -> m Args)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Args -> m Args)
-> Data Args
Args -> Constr
Args -> DataType
(forall b. Data b => b -> b) -> Args -> Args
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) -> Args -> u
forall u. (forall d. Data d => d -> u) -> Args -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Args -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Args -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Args -> m Args
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Args -> m Args
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Args
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Args -> c Args
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Args)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Args)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Args -> c Args
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Args -> c Args
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Args
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Args
$ctoConstr :: Args -> Constr
toConstr :: Args -> Constr
$cdataTypeOf :: Args -> DataType
dataTypeOf :: Args -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Args)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Args)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Args)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Args)
$cgmapT :: (forall b. Data b => b -> b) -> Args -> Args
gmapT :: (forall b. Data b => b -> b) -> Args -> Args
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Args -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Args -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Args -> r
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Args -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Args -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> Args -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Args -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Args -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Args -> m Args
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Args -> m Args
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Args -> m Args
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Args -> m Args
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Args -> m Args
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Args -> m Args
Data, Typeable, Int -> Args -> ShowS
[Args] -> ShowS
Args -> String
(Int -> Args -> ShowS)
-> (Args -> String) -> ([Args] -> ShowS) -> Show Args
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Args -> ShowS
showsPrec :: Int -> Args -> ShowS
$cshow :: Args -> String
show :: Args -> String
$cshowList :: [Args] -> ShowS
showList :: [Args] -> ShowS
Show, Args -> Args -> Bool
(Args -> Args -> Bool) -> (Args -> Args -> Bool) -> Eq Args
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Args -> Args -> Bool
== :: Args -> Args -> Bool
$c/= :: Args -> Args -> Bool
/= :: Args -> Args -> Bool
Eq)


get :: IO Args
get :: IO Args
get = Args -> IO Args
forall a. Data a => a -> IO a
cmdArgs (Args -> IO Args) -> Args -> IO Args
forall a b. (a -> b) -> a -> b
$ Args
   { library :: Bool
library     = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Only the compiler args of the library section are printed out."
   , executable :: [String]
executable  = [String]
forall a. Default a => a
def [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"NAME" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Only the compiler args of the executable section are printed out."
   , testSuite :: [String]
testSuite   = [String]
forall a. Default a => a
def [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"NAME" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Only the compiler args of the test suite section are printed out."
   , benchmark :: [String]
benchmark   = [String]
forall a. Default a => a
def [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"NAME" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Only the compiler args of the benchmark section are printed out."
   , allSections :: Bool
allSections = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Compiler args of all sections are printed out."
   , only :: [Field]
only        = [Field]
forall a. Default a => a
def [Field] -> Ann -> [Field]
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"FIELD" [Field] -> Ann -> [Field]
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Only the specified compiler args are printed out, otherwise all args are printed out. The field name equals the ones in the cabal file, just the '-' replaced by a '_' e.g.: hs_source_dirs, ghc_options, cpp_options ..."
   , ignore :: [Field]
ignore      = [Field]
forall a. Default a => a
def [Field] -> Ann -> [Field]
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"FIELD" [Field] -> Ann -> [Field]
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"These compiler args are ignored, not printed out."
   , format :: Formatting
format      = Formatting
forall a. Default a => a
def Formatting -> Ann -> Formatting
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"FORMAT" Formatting -> Ann -> Formatting
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"How the print out should be formated: ghc, hdevtools, pure."
   , sourceFile :: Maybe String
sourceFile  = Maybe String
forall a. Default a => a
def Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"FILE" Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"If given, then the cabal file is searched for a matching section. If multiple sections match, then all sections are used."
   , cabalFile :: Maybe String
cabalFile   = Maybe String
forall a. Default a => a
def Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"FILE" Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"If not given, then a cabal file is searched upwards the directory tree."
   , enable :: [String]
enable      = [String]
forall a. Default a => a
def [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= Ann
explicit [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"FLAGNAME" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"enable" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"E" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Enable a flag defined in the cabal file."
   , disable :: [String]
disable     = [String]
forall a. Default a => a
def [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= Ann
explicit [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"FLAGNAME" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"disable" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"D" [String] -> Ann -> [String]
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Disable a flag defined in the cabal file."
   , os :: Maybe String
os          = Maybe String
forall a. Default a => a
def Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= Ann
explicit Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"NAME" Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"os" Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Set the used OS. See 'Distribution.System.OS' in the cabal library for valid values."
   , arch :: Maybe String
arch        = Maybe String
forall a. Default a => a
def Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= Ann
explicit Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
typ String
"NAME" Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
name String
"arch" Maybe String -> Ann -> Maybe String
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"Set the used Arch. See 'Distribution.System.Arch' in the cabal library for valid values."
   , relative :: Bool
relative    = Bool
forall a. Default a => a
def Bool -> Ann -> Bool
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"If all returned paths should be relative to the directory of the cabal file, otherwise the paths are absolute. This option is mostly only used for the normalization of the output for the test cases."
   }
   Args -> Ann -> Args
forall val. Data val => val -> Ann -> val
&= String -> Ann
program String
"cabal-cargs"
   Args -> Ann -> Args
forall val. Data val => val -> Ann -> val
&= String -> Ann
summary String
""
   Args -> Ann -> Args
forall val. Data val => val -> Ann -> val
&= String -> Ann
help String
"A command line program for extracting compiler arguments from a cabal file."
   Args -> Ann -> Args
forall val. Data val => val -> Ann -> val
&= [Ann] -> Ann
helpArg [Ann
explicit, String -> Ann
name String
"help", String -> Ann
name String
"h"]
   Args -> Ann -> Args
forall val. Data val => val -> Ann -> val
&= [Ann] -> Ann
versionArg [Ann
explicit, String -> Ann
name String
"version", String -> Ann
name String
"v", String -> Ann
summary String
versionInfo]


versionInfo :: String
versionInfo :: String
versionInfo =
#ifdef CABAL
   String
"cabal-cargs version " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Version -> String
showVersion Version
version
#else
   "cabal-cargs version unknown (not built with cabal)"
#endif