Cabal-1.11.2: A framework for packaging Haskell software




This is a big module, but not very complicated. The code is very regular and repetitive. It defines the command line interface for all the Cabal commands. For each command (like configure, build etc) it defines a type that holds all the flags, the default set of flags and a CommandUI that maps command line flags to and from the corresponding flags type.

All the flags types are instances of Monoid, see for an explanation.

The types defined here get used in the front end and especially in cabal-install which has to do quite a bit of manipulating sets of command line flags.

This is actually relatively nice, it works quite well. The main change it needs is to unify it with the code for managing sets of fields that can be read and written from files. This would allow us to save configure flags in config files.



data GlobalFlags

Flags that apply at the top level, not to any sub-command.


data ConfigFlags

Flags to configure command




configPrograms :: ProgramConfiguration

All programs that cabal may run

configProgramPaths :: [(String, FilePath)]

user specifed programs paths

configProgramArgs :: [(String, [String])]

user specifed programs args

configHcFlavor :: Flag CompilerFlavor

The "flavor" of the compiler, sugh as GHC or Hugs.

configHcPath :: Flag FilePath

given compiler location

configHcPkg :: Flag FilePath

given hc-pkg location

configVanillaLib :: Flag Bool

Enable vanilla library

configProfLib :: Flag Bool

Enable profiling in the library

configSharedLib :: Flag Bool

Build shared library

configDynExe :: Flag Bool

Enable dynamic linking of the executables.

configProfExe :: Flag Bool

Enable profiling in the executables.

configConfigureArgs :: [String]

Extra arguments to configure

configOptimization :: Flag OptimisationLevel

Enable optimization.

configProgPrefix :: Flag PathTemplate

Installed executable prefix.

configProgSuffix :: Flag PathTemplate

Installed executable suffix.

configInstallDirs :: InstallDirs (Flag PathTemplate)

Installation paths

configScratchDir :: Flag FilePath
configExtraLibDirs :: [FilePath]

path to search for extra libraries

configExtraIncludeDirs :: [FilePath]

path to search for header files

configDistPref :: Flag FilePath

dist prefix

configVerbosity :: Flag Verbosity

verbosity level

configUserInstall :: Flag Bool

The --user/--global flag

configPackageDB :: Flag PackageDB

Which package DB to use

configGHCiLib :: Flag Bool

Enable compiling library for GHCi

configSplitObjs :: Flag Bool

Enable -split-objs with GHC

configStripExes :: Flag Bool

Enable executable stripping

configConstraints :: [Dependency]

Additional constraints for dependencies

configConfigurationsFlags :: FlagAssignment
configTests :: Flag Bool

Enable test suite compilation

configLibCoverage :: Flag Bool

Enable test suite program coverage

data CopyFlags

Flags to copy: (destdir, copy-prefix (backwards compat), verbosity)

data RegisterFlags

Flags to register and unregister: (user package, gen-script, in-place, verbosity)

data SDistFlags

Flags to sdist: (snapshot, verbosity)

data CopyDest

The location prefix for the copy command.


CopyTo FilePath 


configureArgs :: Bool -> ConfigFlags -> [String]

Arguments to pass to a configure script, e.g. generated by autoconf.

data Flag a

All flags are monoids, they come in two flavours:

  1. list flags eg
 --ghc-option=foo --ghc-option=bar

gives us all the values [foo, bar]

  1. singular value flags, eg:
 --enable-foo --disable-foo

gives us Just False So this Flag type is for the latter singular kind of flag. Its monoid instance gives us the behaviour where it starts out as NoFlag and later flags override earlier ones.


Flag a 


Functor Flag 
Bounded a => Bounded (Flag a) 
Enum a => Enum (Flag a) 
Eq a => Eq (Flag a) 
Read a => Read (Flag a) 
Show a => Show (Flag a) 
Monoid (Flag a) 

toFlag :: a -> Flag a

fromFlag :: Flag a -> a

fromFlagOrDefault :: a -> Flag a -> a

flagToList :: Flag a -> [a]

boolOpt :: SFlags -> SFlags -> MkOptDescr (a -> Flag Bool) (Flag Bool -> a -> a) a

boolOpt' :: OptFlags -> OptFlags -> MkOptDescr (a -> Flag Bool) (Flag Bool -> a -> a) a

trueArg :: SFlags -> LFlags -> Description -> (b -> Flag Bool) -> (Flag Bool -> b -> b) -> OptDescr b

falseArg :: SFlags -> LFlags -> Description -> (b -> Flag Bool) -> (Flag Bool -> b -> b) -> OptDescr b

optionVerbosity :: (flags -> Flag Verbosity) -> (Flag Verbosity -> flags -> flags) -> OptionField flags