Files
haskell.nix/docs/reference/library.md
T
Rodney Lorrimar e15f235319 More documentation (#179)
* docs: Fix notes about .nix-tools.cache

Relates to #57

* docs: Add note about Cabal 2.4 requirement

Fixes #164

* docs: Autogenerate module option reference

* docs: Update library reference

* Buildkite: enable docs build on branches
2019-06-15 07:11:52 +02:00

242 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[Haskell.nix][] contains a library of functions for creating buildable
package sets from their Nix expression descriptions. The library is
what you get when importing [Haskell.nix][]. It might be helpful to
load the library in the [Nix REPL](../user-guide.md#using-nix-repl) to
test things.
* [Types](#types) — the kinds of data that you will encounter working with [Haskell.nix][].
* [Top-level attributes](#top-level-attributes) — Functions and derivations defined in the Haskell.nix attrset.
* [Package-set functions](#package-set-functions) — Helper functions defined on the `hsPkgs` package set.
# Types
## Package Set
The result of `mkPkgSet`. This is an application of the NixOS module
system.
```
{
options = { ... };
config = {
hsPkgs = { ... };
packages = { ... };
compiler = {
version = "X.Y.Z";
nix-name = "ghcXYZ";
packages = { ... };
};
};
}
```
| Attribute | Type | Description |
|----------------|------|-----------------------------------------------------|
| `options` | Module options | The combination of all options set through the `modules` argument passed to `mkPkgsSet`. |
| `config` | | The result of evaluating and applying the `options` with [Haskell.nix][] |
| `.hsPkgs` | Attrset of [Haskell Packages](#haskell-package) | Buildable packages, created from `packages` |
| `.packages` | Attrset of [Haskell Package descriptions](#haskell-package-descriptions) | Configuration for each package in `hsPkgs` |
| `.compiler` | Attrset | |
## Haskell Package description
The _Haskell package descriptions_ are values of the
`pkgSet.config.packages` attrset. These are not derivations, but just
the configuration for building an individual package. The
configuration options are described under `packages.<name>` in [Module
options](./modules.md).
## Component description
The _component descriptions_ are values of the
`pkgSet.config.packages.<package>.components` attrset. These are not
derivations, but just the configuration for building an individual
component. The configuration options are described under
`packages.<name>.components.*` in [Module options](./modules.md).
## Haskell Package
In [Haskell.nix][], a _Haskell package_ is a derivation which has a
`components` attribute. This derivation is actually just for the
package `Setup.hs` script, and isn't very interesting. To actually use
the package, look within the components structure.
```
components = {
library = COMPONENT;
exes = { NAME = COMPONENT; };
tests = { NAME = COMPONENT; };
benchmarks = { NAME = COMPONENT; };
all = COMPONENT;
}
```
## Component
In [Haskell.nix][], a _component_ is a derivation corresponding to a
[Cabal component](https://www.haskell.org/cabal/users-guide/developing-packages.html)
of a package.
[Haskell.nix][] also defines a special `all` component, which is the
union of all components in the package.
## Identifier
A package identifier is an attrset pair of `name` and `version`.
## Extras
Extras allow adding more packages to the package set. These will be
functions taking a single parameter `hackage`. They should return an
attrset of package descriptions.
## Modules
Modules are the primary method of configuring building of the package
set. They are either:
1. an attrset containing [option declarations](./options.md), or
2. a function that returns an attrset containing option declarations.
If using the function form of a module, the following named parameters
will be passed to it:
| Argument | Type | Description |
|------------------|------|---------------------|
| `haskellLib` | attrset | The [haskellLib](#haskelllib) utility functions. |
| `pkgs` | | The Nixpkgs collection. |
| `pkgconfPkgs` | | A mapping of cabal build-depends names to Nixpkgs packages. (TODO: more information about this) |
| `buildModules` | | |
| `config` | | |
| `options` | | |
# Top-level attributes
## mkStackPkgSet
Creates a [package set](#package-set) based on the `pkgs.nix` output
of `stack-to-nix`.
```nix
mkStackPkgSet =
{ stack-pkgs, pkg-def-extras ? [], modules ? []}: ...
```
| Argument | Type | Description |
|------------------|------|---------------------|
| `stack-pkgs` | | `import ./pkgs.nix` — The imported file generated by `stack‑to‑nix`. |
| `pkg‑def‑extras` | List of [Extras](#extras) | For overriding the package set. |
| `modules` | List of [Modules](#modules) | For overriding the package set. |
**Return value**: a [`pkgSet`](#package-set)
## mkCabalProjectPkgSet
Creates a [package set](#package-set) based on the `pkgs.nix` output
of `plan-to-nix`.
```nix
mkCabalProjectPkgSet =
{ plan-pkgs, pkg-def-extras ? [], modules ? []}: ...
```
| Argument | Type | Description |
|------------------|------|---------------------|
| `plan-pkgs` | | `import ./pkgs.nix` — The imported file generated by `plan‑to‑nix`. |
| `pkg‑def‑extras` | List of [Extras](#extras) | For overriding the package set. |
| `modules` | List of [Modules](#modules) | For overriding the package set. |
**Return value**: a [`pkgSet`](#package-set)
## mkPkgSet
This is the base function used by both `mkStackPkgSet` and
`mkCabalProjectPkgSet`.
**Return value**: a [`pkgSet`](#package-set)
## snapshots
This is an attrset of `hsPkgs` packages from Stackage.
## haskellPackages
A `hsPkgs` package set, which is one of the recent LTS Haskell
releases from [`snapshots`](#snapshots).
The chosen LTS is updated occasionally in [Haskell.nix][], though a
manual process.
## nix-tools
A derivation containing the `nix-tools` [command-line tools](commands.md).
## callStackToNix
## callCabalProjectToNix
## hackage
## stackage
## fetchExternal
## cleanSourceHaskell
## haskellLib
Assorted functions for operating on [Haskell.nix][] data. This is
distinct from `pkgs.haskell.lib` in the current Nixpkgs Haskell
Infrastructure.
# Package-set functions
These functions exist within the `hsPkgs` package set.
## shellFor
Create a `nix-shell` [development
environment](../user-guide/development.md) for developing one or more
packages.
```
shellFor =
{ packages, withHoogle ? true, ...}: ...
```
| Argument | Type | Description |
|----------------|------|---------------------|
| `packages` | Function | Package selection function. It takes a list of [Haskell packages](#haskell-package) and returns a subset of these packages. |
| `withHoogle` | Boolean | Whether to build a Hoogle documentation index and provide the `hoogle` command. |
| `{ ... }` | Attrset | All the other arguments are passed to [`mkDerivation`](https://nixos.org/nixpkgs/manual/#sec-using-stdenv). |
**Return value**: a derivation
## ghcWithPackages
Creates a `nix-shell` [development
environment](../user-guide/development.md) including the given
packages selected from this package set.
**Parameter**: a package selection function.
**Return value**: a derivation
**Example**:
```
haskell.haskellPackages.ghcWithPackages (ps: with ps; [ lens conduit ])
```
## ghcWithHoogle
The same as `ghcWithPackages`, except, a `hoogle` command with a
Hoogle documentation index of the packages will be included in the
shell.
[haskell.nix]: https://github.com/input-output-hk/haskell.nix