Copyright | Isaac Jones 2003-2005 |
---|---|
License | BSD3 |
Maintainer | cabal-devel@haskell.org |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
Backwards compatibility reexport of everything you need to know
about .cabal
files.
- data PackageDescription = PackageDescription {
- package :: PackageIdentifier
- license :: License
- licenseFiles :: [FilePath]
- copyright :: String
- maintainer :: String
- author :: String
- stability :: String
- testedWith :: [(CompilerFlavor, VersionRange)]
- homepage :: String
- pkgUrl :: String
- bugReports :: String
- sourceRepos :: [SourceRepo]
- synopsis :: String
- description :: String
- category :: String
- customFieldsPD :: [(String, String)]
- buildDepends :: [Dependency]
- specVersionRaw :: Either Version VersionRange
- buildType :: Maybe BuildType
- setupBuildInfo :: Maybe SetupBuildInfo
- library :: Maybe Library
- subLibraries :: [Library]
- executables :: [Executable]
- foreignLibs :: [ForeignLib]
- testSuites :: [TestSuite]
- benchmarks :: [Benchmark]
- dataFiles :: [FilePath]
- dataDir :: FilePath
- extraSrcFiles :: [FilePath]
- extraTmpFiles :: [FilePath]
- extraDocFiles :: [FilePath]
- emptyPackageDescription :: PackageDescription
- specVersion :: PackageDescription -> Version
- descCabalVersion :: PackageDescription -> VersionRange
- data BuildType
- knownBuildTypes :: [BuildType]
- allLibraries :: PackageDescription -> [Library]
- data ModuleRenaming
- defaultRenaming :: ModuleRenaming
- data Library = Library {}
- data ModuleReexport = ModuleReexport {}
- emptyLibrary :: Library
- withLib :: PackageDescription -> (Library -> IO ()) -> IO ()
- hasPublicLib :: PackageDescription -> Bool
- hasLibs :: PackageDescription -> Bool
- explicitLibModules :: Library -> [ModuleName]
- libModulesAutogen :: Library -> [ModuleName]
- libModules :: Library -> [ModuleName]
- data Executable = Executable {}
- emptyExecutable :: Executable
- withExe :: PackageDescription -> (Executable -> IO ()) -> IO ()
- hasExes :: PackageDescription -> Bool
- exeModules :: Executable -> [ModuleName]
- exeModulesAutogen :: Executable -> [ModuleName]
- data TestSuite = TestSuite {}
- data TestSuiteInterface
- data TestType
- testType :: TestSuite -> TestType
- knownTestTypes :: [TestType]
- emptyTestSuite :: TestSuite
- hasTests :: PackageDescription -> Bool
- withTest :: PackageDescription -> (TestSuite -> IO ()) -> IO ()
- testModules :: TestSuite -> [ModuleName]
- testModulesAutogen :: TestSuite -> [ModuleName]
- data Benchmark = Benchmark {}
- data BenchmarkInterface
- data BenchmarkType
- benchmarkType :: Benchmark -> BenchmarkType
- knownBenchmarkTypes :: [BenchmarkType]
- emptyBenchmark :: Benchmark
- hasBenchmarks :: PackageDescription -> Bool
- withBenchmark :: PackageDescription -> (Benchmark -> IO ()) -> IO ()
- benchmarkModules :: Benchmark -> [ModuleName]
- benchmarkModulesAutogen :: Benchmark -> [ModuleName]
- data BuildInfo = BuildInfo {
- buildable :: Bool
- buildTools :: [LegacyExeDependency]
- buildToolDepends :: [ExeDependency]
- cppOptions :: [String]
- ccOptions :: [String]
- ldOptions :: [String]
- pkgconfigDepends :: [PkgconfigDependency]
- frameworks :: [String]
- extraFrameworkDirs :: [String]
- cSources :: [FilePath]
- jsSources :: [FilePath]
- hsSourceDirs :: [FilePath]
- otherModules :: [ModuleName]
- autogenModules :: [ModuleName]
- defaultLanguage :: Maybe Language
- otherLanguages :: [Language]
- defaultExtensions :: [Extension]
- otherExtensions :: [Extension]
- oldExtensions :: [Extension]
- extraLibs :: [String]
- extraGHCiLibs :: [String]
- extraLibDirs :: [String]
- includeDirs :: [FilePath]
- includes :: [FilePath]
- installIncludes :: [FilePath]
- options :: [(CompilerFlavor, [String])]
- profOptions :: [(CompilerFlavor, [String])]
- sharedOptions :: [(CompilerFlavor, [String])]
- customFieldsBI :: [(String, String)]
- targetBuildDepends :: [Dependency]
- mixins :: [Mixin]
- emptyBuildInfo :: BuildInfo
- allBuildInfo :: PackageDescription -> [BuildInfo]
- allLanguages :: BuildInfo -> [Language]
- allExtensions :: BuildInfo -> [Extension]
- usedExtensions :: BuildInfo -> [Extension]
- hcOptions :: CompilerFlavor -> BuildInfo -> [String]
- hcProfOptions :: CompilerFlavor -> BuildInfo -> [String]
- hcSharedOptions :: CompilerFlavor -> BuildInfo -> [String]
- data ComponentName
- defaultLibName :: ComponentName
- type HookedBuildInfo = (Maybe BuildInfo, [(UnqualComponentName, BuildInfo)])
- emptyHookedBuildInfo :: HookedBuildInfo
- updatePackageDescription :: HookedBuildInfo -> PackageDescription -> PackageDescription
- data GenericPackageDescription = GenericPackageDescription {
- packageDescription :: PackageDescription
- genPackageFlags :: [Flag]
- condLibrary :: Maybe (CondTree ConfVar [Dependency] Library)
- condSubLibraries :: [(UnqualComponentName, CondTree ConfVar [Dependency] Library)]
- condForeignLibs :: [(UnqualComponentName, CondTree ConfVar [Dependency] ForeignLib)]
- condExecutables :: [(UnqualComponentName, CondTree ConfVar [Dependency] Executable)]
- condTestSuites :: [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
- condBenchmarks :: [(UnqualComponentName, CondTree ConfVar [Dependency] Benchmark)]
- data Flag = MkFlag {}
- emptyFlag :: FlagName -> Flag
- data FlagName
- mkFlagName :: String -> FlagName
- unFlagName :: FlagName -> String
- type FlagAssignment = [(FlagName, Bool)]
- showFlagValue :: (FlagName, Bool) -> String
- dispFlagAssignment :: FlagAssignment -> Doc
- parseFlagAssignment :: ReadP r FlagAssignment
- data CondTree v c a = CondNode {
- condTreeData :: a
- condTreeConstraints :: c
- condTreeComponents :: [CondBranch v c a]
- data ConfVar
- data Condition c
- cNot :: Condition a -> Condition a
- cAnd :: Condition a -> Condition a -> Condition a
- cOr :: Eq v => Condition v -> Condition v -> Condition v
- data SourceRepo = SourceRepo {}
- data RepoKind
- data RepoType
- knownRepoTypes :: [RepoType]
- emptySourceRepo :: RepoKind -> SourceRepo
- data SetupBuildInfo = SetupBuildInfo {}
Package descriptions
data PackageDescription Source #
This data type is the internal representation of the file pkg.cabal
.
It contains two kinds of information about the package: information
which is needed for all packages, such as the package name and version, and
information which is needed for the simple build system only, such as
the compiler options and library name.
PackageDescription | |
|
specVersion :: PackageDescription -> Version Source #
The version of the Cabal spec that this package should be interpreted against.
Historically we used a version range but we are switching to using a single version. Currently we accept either. This function converts into a single version by ignoring upper bounds in the version range.
descCabalVersion :: PackageDescription -> VersionRange Source #
Deprecated: Use specVersion instead
The range of versions of the Cabal tools that this package is intended to work with.
This function is deprecated and should not be used for new purposes, only to support old packages that rely on the old interpretation.
The type of build system used by this package.
Simple | calls |
Configure | calls |
Make | calls |
Custom | uses user-supplied |
UnknownBuildType String | a package that uses an unknown build type cannot actually be built. Doing it this way rather than just giving a parse error means we get better error messages and allows you to inspect the rest of the package description. |
knownBuildTypes :: [BuildType] Source #
allLibraries :: PackageDescription -> [Library] Source #
Renaming (syntactic)
data ModuleRenaming Source #
Renaming applied to the modules provided by a package.
The boolean indicates whether or not to also include all of the
original names of modules. Thus, ModuleRenaming False []
is
"don't expose any modules, and ModuleRenaming True [(Data.Bool, Bool)]
is, "expose all modules, but also expose Data.Bool
as Bool
".
If a renaming is omitted you get the DefaultRenaming
.
(NB: This is a list not a map so that we can preserve order.)
ModuleRenaming [(ModuleName, ModuleName)] | A module renaming/thinning; e.g., |
DefaultRenaming | The default renaming, bringing all exported modules into scope. |
HidingRenaming [ModuleName] | Hiding renaming, e.g., |
defaultRenaming :: ModuleRenaming Source #
The default renaming, if something is specified in build-depends
only.
Libraries
Library | |
|
withLib :: PackageDescription -> (Library -> IO ()) -> IO () Source #
If the package description has a buildable library section,
call the given function with the library build info as argument.
You probably want withLibLBI
if you have a LocalBuildInfo
,
see the note in
Distribution.Types.ComponentRequestedSpec
for more information.
hasPublicLib :: PackageDescription -> Bool Source #
Does this package have a buildable PUBLIC library?
hasLibs :: PackageDescription -> Bool Source #
Does this package have any libraries?
explicitLibModules :: Library -> [ModuleName] Source #
Get all the module names from the library (exposed and internal modules) which are explicitly listed in the package description which would need to be compiled. (This does not include reexports, which do not need to be compiled.) This may not include all modules for which GHC generated interface files (i.e., implicit modules.)
libModulesAutogen :: Library -> [ModuleName] Source #
Get all the auto generated module names from the library, exposed or not.
This are a subset of libModules
.
libModules :: Library -> [ModuleName] Source #
Deprecated: If you want all modules that are built with a library, use allLibModules
. Otherwise, use explicitLibModules
for ONLY the modules explicitly mentioned in the package description.
Backwards-compatibility shim for explicitLibModules
. In most cases,
you actually want allLibModules
, which returns all modules that will
actually be compiled, as opposed to those which are explicitly listed
in the package description (explicitLibModules
); unfortunately, the
type signature for allLibModules
is incompatible since we need a
ComponentLocalBuildInfo
.
Executables
data Executable Source #
withExe :: PackageDescription -> (Executable -> IO ()) -> IO () Source #
Perform the action on each buildable Executable
in the package
description. You probably want withExeLBI
if you have a
LocalBuildInfo
, see the note in
Distribution.Types.ComponentRequestedSpec
for more information.
hasExes :: PackageDescription -> Bool Source #
does this package have any executables?
exeModules :: Executable -> [ModuleName] Source #
Get all the module names from an exe
exeModulesAutogen :: Executable -> [ModuleName] Source #
Get all the auto generated module names from an exe
This are a subset of exeModules
.
Tests
A "test-suite" stanza in a cabal file.
data TestSuiteInterface Source #
The test suite interfaces that are currently defined. Each test suite must specify which interface it supports.
More interfaces may be defined in future, either new revisions or totally new interfaces.
TestSuiteExeV10 Version FilePath | Test interface "exitcode-stdio-1.0". The test-suite takes the form of an executable. It returns a zero exit code for success, non-zero for failure. The stdout and stderr channels may be logged. It takes no command line parameters and nothing on stdin. |
TestSuiteLibV09 Version ModuleName | Test interface "detailed-0.9". The test-suite takes the form of a library containing a designated module that exports "tests :: [Test]". |
TestSuiteUnsupported TestType | A test suite that does not conform to one of the above interfaces for the given reason (e.g. unknown test type). |
The "test-type" field in the test suite stanza.
TestTypeExe Version | "type: exitcode-stdio-x.y" |
TestTypeLib Version | "type: detailed-x.y" |
TestTypeUnknown String Version | Some unknown test type e.g. "type: foo" |
knownTestTypes :: [TestType] Source #
hasTests :: PackageDescription -> Bool Source #
Does this package have any test suites?
withTest :: PackageDescription -> (TestSuite -> IO ()) -> IO () Source #
Perform an action on each buildable TestSuite
in a package.
You probably want withTestLBI
if you have a LocalBuildInfo
, see the note in
Distribution.Types.ComponentRequestedSpec
for more information.
testModules :: TestSuite -> [ModuleName] Source #
Get all the module names from a test suite.
testModulesAutogen :: TestSuite -> [ModuleName] Source #
Get all the auto generated module names from a test suite.
This are a subset of testModules
.
Benchmarks
A "benchmark" stanza in a cabal file.
data BenchmarkInterface Source #
The benchmark interfaces that are currently defined. Each benchmark must specify which interface it supports.
More interfaces may be defined in future, either new revisions or totally new interfaces.
BenchmarkExeV10 Version FilePath | Benchmark interface "exitcode-stdio-1.0". The benchmark takes the form of an executable. It returns a zero exit code for success, non-zero for failure. The stdout and stderr channels may be logged. It takes no command line parameters and nothing on stdin. |
BenchmarkUnsupported BenchmarkType | A benchmark that does not conform to one of the above interfaces for the given reason (e.g. unknown benchmark type). |
data BenchmarkType Source #
The "benchmark-type" field in the benchmark stanza.
BenchmarkTypeExe Version | "type: exitcode-stdio-x.y" |
BenchmarkTypeUnknown String Version | Some unknown benchmark type e.g. "type: foo" |
hasBenchmarks :: PackageDescription -> Bool Source #
Does this package have any benchmarks?
withBenchmark :: PackageDescription -> (Benchmark -> IO ()) -> IO () Source #
Perform an action on each buildable Benchmark
in a package.
You probably want withBenchLBI
if you have a LocalBuildInfo
, see the note in
Distribution.Types.ComponentRequestedSpec
for more information.
benchmarkModules :: Benchmark -> [ModuleName] Source #
Get all the module names from a benchmark.
benchmarkModulesAutogen :: Benchmark -> [ModuleName] Source #
Get all the auto generated module names from a benchmark.
This are a subset of benchmarkModules
.
Build information
BuildInfo | |
|
allBuildInfo :: PackageDescription -> [BuildInfo] Source #
The BuildInfo
for the library (if there is one and it's buildable), and
all buildable executables, test suites and benchmarks. Useful for gathering
dependencies.
allExtensions :: BuildInfo -> [Extension] Source #
The Extension
s that are used somewhere by this component
usedExtensions :: BuildInfo -> [Extension] Source #
The Extensions
that are used by all modules in this component
hcOptions :: CompilerFlavor -> BuildInfo -> [String] Source #
Select options for a particular Haskell compiler.
hcProfOptions :: CompilerFlavor -> BuildInfo -> [String] Source #
hcSharedOptions :: CompilerFlavor -> BuildInfo -> [String] Source #
Supplementary build information
data ComponentName Source #
type HookedBuildInfo = (Maybe BuildInfo, [(UnqualComponentName, BuildInfo)]) Source #
HookedBuildInfo
is mechanism that hooks can use to
override the BuildInfo
s inside packages. One example
use-case (which is used in core libraries today) is as
a way of passing flags which are computed by a configure
script into Cabal. In this case, the autoconf build type adds
hooks to read in a textual HookedBuildInfo
format prior
to doing any operations.
Quite honestly, this mechanism is a massive hack since we shouldn't
be editing the PackageDescription
data structure (it's easy
to assume that this data structure shouldn't change and
run into bugs, see for example 1c20a6328579af9e37677d507e2e9836ef70ab9d).
But it's a bit convenient, because there isn't another data
structure that allows adding extra BuildInfo
style things.
In any case, a lot of care has to be taken to make sure the
HookedBuildInfo
is applied to the PackageDescription
. In
general this process occurs in Distribution.Simple, which is
responsible for orchestrating the hooks mechanism. The
general strategy:
- We run the pre-hook, which produces a
HookedBuildInfo
(e.g., in the Autoconf case, it reads it out from a file). - We sanity-check the hooked build info with
sanityCheckHookedBuildInfo
. - We update our
PackageDescription
(either freshly read or cached fromLocalBuildInfo
) withupdatePackageDescription
.
In principle, we are also supposed to update the copy of
the PackageDescription
stored in LocalBuildInfo
at localPkgDescr
. Unfortunately, in practice, there
are lots of Custom setup scripts which fail to update
localPkgDescr
so you really shouldn't rely on it.
It's not DEPRECATED because there are legitimate uses
for it, but... yeah. Sharp knife. See
https://github.com/haskell/cabal/issues/3606
for more information on the issue.
It is not well-specified whether or not a HookedBuildInfo
applied
at configure time is persistent to the LocalBuildInfo
. The
fact that HookedBuildInfo
is passed to confHook
MIGHT SUGGEST
that the HookedBuildInfo
is applied at this time, but actually
since 9317b67e6122ab14e53f81b573bd0ecb388eca5a it has been ONLY used
to create a modified package description that we check for problems:
it is never actually saved to the LBI. Since HookedBuildInfo
is
applied monoidally to the existing build infos (and it is not an
idempotent monoid), it could break things to save it, since we
are obligated to apply any new HookedBuildInfo
and then we'd
get the effect twice. But this does mean we have to re-apply
it every time. Hey, it's more flexibility.
package configuration
data GenericPackageDescription Source #
A flag can represent a feature to be included, or a way of linking a target against its dependencies, or in fact whatever you can think of.
MkFlag | |
|
A FlagName
is the name of a user-defined configuration flag
Use mkFlagName
and unFlagName
to convert from/to a String
.
This type is opaque since Cabal-2.0
Since: 2.0
mkFlagName :: String -> FlagName Source #
Construct a FlagName
from a String
mkFlagName
is the inverse to unFlagName
Note: No validations are performed to ensure that the resulting
FlagName
is valid
Since: 2.0
type FlagAssignment = [(FlagName, Bool)] Source #
A FlagAssignment
is a total or partial mapping of FlagName
s to
Bool
flag values. It represents the flags chosen by the user or
discovered during configuration. For example --flags=foo --flags=-bar
becomes [("foo", True), ("bar", False)]
dispFlagAssignment :: FlagAssignment -> Doc Source #
Pretty-prints a flag assignment.
parseFlagAssignment :: ReadP r FlagAssignment Source #
Parses a flag assignment.
A CondTree
is used to represent the conditional structure of
a Cabal file, reflecting a syntax element subject to constraints,
and then any number of sub-elements which may be enabled subject
to some condition. Both a
and c
are usually Monoid
s.
To be more concrete, consider the following fragment of a Cabal
file:
build-depends: base >= 4.0 if flag(extra) build-depends: base >= 4.2
One way to represent this is to have
. Here, CondTree
ConfVar
[Dependency
] BuildInfo
condTreeData
represents
the actual fields which are not behind any conditional, while
condTreeComponents
recursively records any further fields
which are behind a conditional. condTreeConstraints
records
the constraints (in this case, base >= 4.0
) which would
be applied if you use this syntax; in general, this is
derived off of targetBuildInfo
(perhaps a good refactoring
would be to convert this into an opaque type, with a smart
constructor that pre-computes the dependencies.)
CondNode | |
|
Functor (CondTree v c) Source # | |
Foldable (CondTree v c) Source # | |
Traversable (CondTree v c) Source # | |
(Eq v, Eq c, Eq a) => Eq (CondTree v c a) Source # | |
(Data a, Data c, Data v) => Data (CondTree v c a) Source # | |
(Show v, Show c, Show a) => Show (CondTree v c a) Source # | |
Generic (CondTree v c a) Source # | |
(Binary v, Binary c, Binary a) => Binary (CondTree v c a) Source # | |
type Rep (CondTree v c a) Source # | |
A ConfVar
represents the variable type used.
A boolean expression parameterized over the variable type used.
Monad Condition Source # | |
Functor Condition Source # | |
Applicative Condition Source # | |
Foldable Condition Source # | |
Traversable Condition Source # | |
Alternative Condition Source # | |
MonadPlus Condition Source # | |
Eq c => Eq (Condition c) Source # | |
Data c => Data (Condition c) Source # | |
Show c => Show (Condition c) Source # | |
Generic (Condition c) Source # | |
Semigroup (Condition a) Source # | |
Monoid (Condition a) Source # | |
Binary c => Binary (Condition c) Source # | |
type Rep (Condition c) Source # | |
cOr :: Eq v => Condition v -> Condition v -> Condition v Source #
Boolean OR of two Condition
values.
Source repositories
data SourceRepo Source #
Information about the source revision control system for a package.
When specifying a repo it is useful to know the meaning or intention of the
information as doing so enables automation. There are two obvious common
purposes: one is to find the repo for the latest development version, the
other is to find the repo for this specific release. The ReopKind
specifies which one we mean (or another custom one).
A package can specify one or the other kind or both. Most will specify just a head repo but some may want to specify a repo to reconstruct the sources for this package release.
The required information is the RepoType
which tells us if it's using
Darcs
, Git
for example. The repoLocation
and other details are
interpreted according to the repo type.
SourceRepo | |
|
What this repo info is for, what it represents.
RepoHead | The repository for the "head" or development version of the project. This repo is where we should track the latest development activity or the usual repo people should get to contribute patches. |
RepoThis | The repository containing the sources for this exact package version or release. For this kind of repo a tag should be given to give enough information to re-create the exact sources. |
RepoKindUnknown String |
An enumeration of common source control systems. The fields used in the
SourceRepo
depend on the type of repo. The tools and methods used to
obtain and track the repo depend on the repo type.
knownRepoTypes :: [RepoType] Source #
emptySourceRepo :: RepoKind -> SourceRepo Source #
Custom setup build information
data SetupBuildInfo Source #
SetupBuildInfo | |
|