Cabal-1.22.6.0: A framework for packaging Haskell software

Portabilityportable
Maintainercabal-devel@haskell.org
Safe HaskellSafe-Inferred

Distribution.Package

Contents

Description

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".

Synopsis

Package ids

newtype PackageName

Constructors

PackageName 

Fields

unPackageName :: String
 

Instances

data PackageIdentifier

The name and version of a package.

Constructors

PackageIdentifier 

Fields

pkgName :: PackageName

The name of this package, eg. foo

pkgVersion :: Version

the version of this package, eg 1.2

type PackageId = PackageIdentifier

Type alias so we can use the shorter name PackageId.

Installed package identifiers

newtype InstalledPackageId

An InstalledPackageId uniquely identifies an instance of an installed package. There can be at most one package with a given InstalledPackageId in a package database, or overlay of databases.

Constructors

InstalledPackageId String 

Package keys (used for linker symbols and library name)

data PackageKey

Constructors

PackageKey !String !Word64 !Word64

Modern package key which is a hash of the PackageId and the transitive dependency key. Manually inline it here so we can get the instances we need. Also contains a short informative string

OldPackageKey !PackageId

Old-style package key which is just a PackageId. Required because old versions of GHC assume that the sourcePackageId recorded for an installed package coincides with the package key it was compiled with.

Instances

Eq PackageKey 
Data PackageKey 
Ord PackageKey 
Read PackageKey 
Show PackageKey 
Typeable PackageKey 
Generic PackageKey 
NFData PackageKey 
Text PackageKey 

mkPackageKey :: Bool -> PackageId -> [PackageKey] -> [(ModuleName, (PackageKey, ModuleName))] -> PackageKey

Generates a PackageKey from a PackageId, sorted package keys of the immediate dependencies.

Package source dependencies

data Dependency

Describes a dependency on a source package (API)

Instances

Eq Dependency 
Data Dependency 
Read Dependency 
Show Dependency 
Typeable Dependency 
Generic Dependency 
Text Dependency 

Package classes

class Package pkg where

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.

Methods

packageId :: pkg -> PackageIdentifier

packageVersion :: Package pkg => pkg -> Version

class Package pkg => PackageFixedDeps pkg where

Subclass of packages that have specific versioned dependencies.

So for example a not-yet-configured package has dependencies on version ranges, not specific versions. A configured or an already installed package depends on exact versions. Some operations or data structures (like dependency graphs) only make sense on this subclass of package types.

Methods

depends :: pkg -> [PackageIdentifier]

class Package pkg => PackageInstalled pkg where

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.