pack package:Cabal-syntax

Variant of pack, which takes a phantom type.
Converts a package name to an unqualified component name Useful in legacy situations where a package name may refer to an internal component, if one is defined with that name. 2018-12-21: These "legacy" situations are not legacy. We can build-depends on the internal library. However Now dependency contains Set LibraryName, and we should use that.
Defines a package identifier along with a parser and pretty printer for it. PackageIdentifiers consist of a name and an exact version. It also defines a Dependency data type. A dependency is a package name and a version range, like "foo >= 1.2 && < 2".
Class of things that have a PackageIdentifier Types in this class are all notions of a package. This allows us to have different types for the different phases that packages go though, from simple name/id, package description, configured or installed packages. Not all kinds of packages can be uniquely identified by a PackageIdentifier. In particular, installed packages cannot, there may be many installed instances of the same source package.
Class of installed packages. The primary data type which is an instance of this package is InstalledPackageInfo, but when we are doing install plans in Cabal install we may have other, installed package-like things which contain more metadata. Installed packages have exact dependencies installedDepends.
Backwards compatibility reexport of most things you need to know about .cabal files.
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.
This defines the data structure for the .cabal file format. There are several parts to this structure. It has top level info and then Library, Executable, TestSuite, and Benchmark sections each of which have associated BuildInfo data that's used to build the library, exe, test, or benchmark. To further complicate things there is both a PackageDescription and a GenericPackageDescription. This distinction relates to cabal configurations. When we initially read a .cabal file we get a GenericPackageDescription which has all the conditional sections. Before actually building a package we have to decide on each conditional. Once we've done that we get a PackageDescription. It was done this way initially to avoid breaking too much stuff when the feature was introduced. It could probably do with being rationalised at some point to make it simpler.
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.
Type alias so we can use the shorter name PackageId.
The name and version of a package.
A package name. Use mkPackageName and unPackageName to convert from/to a String. This type is opaque since Cabal-2.0