80 lines
2.6 KiB
Markdown
80 lines
2.6 KiB
Markdown
# CHICKEN {#sec-chicken}
|
|
|
|
[CHICKEN](https://call-cc.org/) is a
|
|
[R⁵RS](https://schemers.org/Documents/Standards/R5RS/HTML/)-compliant Scheme
|
|
compiler. It includes an interactive mode and a custom package format, "eggs".
|
|
|
|
## Using Eggs {#sec-chicken-using}
|
|
|
|
Eggs described in nixpkgs are available inside the
|
|
`chickenPackages.chickenEggs` attrset. Including an egg as a build input is
|
|
done in the typical Nix fashion. For example, to include support for [SRFI
|
|
189](https://srfi.schemers.org/srfi-189/srfi-189.html) in a derivation, one
|
|
might write:
|
|
|
|
```nix
|
|
{
|
|
buildInputs = [
|
|
chicken
|
|
chickenPackages.chickenEggs.srfi-189
|
|
];
|
|
}
|
|
```
|
|
|
|
Both `chicken` and its eggs have a setup hook which configures the environment
|
|
variables `CHICKEN_INCLUDE_PATH` and `CHICKEN_REPOSITORY_PATH`.
|
|
|
|
## Updating Eggs {#sec-chicken-updating-eggs}
|
|
|
|
nixpkgs only knows about a subset of all published eggs. It uses
|
|
[egg2nix](https://github.com/the-kenny/egg2nix) to generate a
|
|
package set from a list of eggs to include.
|
|
|
|
The package set is regenerated by running the following shell commands:
|
|
|
|
```
|
|
$ nix-shell -p chickenPackages.egg2nix
|
|
$ cd pkgs/development/compilers/chicken/5/
|
|
$ egg2nix eggs.scm > eggs.nix
|
|
```
|
|
|
|
## Adding Eggs {#sec-chicken-adding-eggs}
|
|
|
|
When we run `egg2nix`, we obtain one collection of eggs with
|
|
mutually-compatible versions. This means that when we add new eggs, we may
|
|
need to update existing eggs. To keep those separate, follow the procedure for
|
|
updating eggs before including more eggs.
|
|
|
|
To include more eggs, edit `pkgs/development/compilers/chicken/5/eggs.scm`.
|
|
The first section of this file lists eggs which are required by `egg2nix`
|
|
itself; all other eggs go into the second section. After editing, follow the
|
|
procedure for updating eggs.
|
|
|
|
## Override Scope {#sec-chicken-override-scope}
|
|
|
|
The chicken package and its eggs, respectively, reside in a scope. This means,
|
|
the scope can be overridden to effect other packages in it.
|
|
|
|
This example shows how to use a local copy of `srfi-180` and have it affect
|
|
all the other eggs:
|
|
|
|
```nix
|
|
let
|
|
myChickenPackages = pkgs.chickenPackages.overrideScope' (self: super: {
|
|
# The chicken package itself can be overridden to effect the whole ecosystem.
|
|
# chicken = super.chicken.overrideAttrs {
|
|
# src = ...
|
|
# };
|
|
|
|
chickenEggs = super.chickenEggs.overrideScope' (eggself: eggsuper: {
|
|
srfi-180 = eggsuper.srfi-180.overrideAttrs {
|
|
# path to a local copy of srfi-180
|
|
src = <...>;
|
|
};
|
|
});
|
|
});
|
|
in
|
|
# Here, `myChickenPackages.chickenEggs.json-rpc`, which depends on `srfi-180` will use
|
|
# the local copy of `srfi-180`.
|
|
<...>
|
|
```
|