pcmsolver: fix build with gcc-14 (#368190)
[NixPkgs.git] / doc / languages-frameworks / agda.section.md
blob33fffc60c8db38628ff1025676835e595abedca5
1 # Agda {#agda}
3 ## How to use Agda {#how-to-use-agda}
5 Agda is available as the [agda](https://search.nixos.org/packages?channel=unstable&show=agda&from=0&size=30&sort=relevance&query=agda)
6 package.
8 The `agda` package installs an Agda-wrapper, which calls `agda` with `--library-file`
9 set to a generated library-file within the nix store, this means your library-file in
10 `$HOME/.agda/libraries` will be ignored. By default the agda package installs Agda
11 with no libraries, i.e. the generated library-file is empty. To use Agda with libraries,
12 the `agda.withPackages` function can be used. This function either takes:
14 * A list of packages,
15 * or a function which returns a list of packages when given the `agdaPackages` attribute set,
16 * or an attribute set containing a list of packages and a GHC derivation for compilation (see below).
17 * or an attribute set containing a function which returns a list of packages when given the `agdaPackages` attribute set and a GHC derivation for compilation (see below).
19 For example, suppose we wanted a version of Agda which has access to the standard library. This can be obtained with the expressions:
21 ```nix
22 agda.withPackages [ agdaPackages.standard-library ]
23 ```
27 ```nix
28 agda.withPackages (p: [ p.standard-library ])
29 ```
31 or can be called as in the [Compiling Agda](#compiling-agda) section.
33 If you want to use a different version of a library (for instance a development version)
34 override the `src` attribute of the package to point to your local repository
36 ```nix
37 agda.withPackages (p: [
38   (p.standard-library.overrideAttrs (oldAttrs: {
39     version = "local version";
40     src = /path/to/local/repo/agda-stdlib;
41   }))
43 ```
45 You can also reference a GitHub repository
47 ```nix
48 agda.withPackages (p: [
49   (p.standard-library.overrideAttrs (oldAttrs: {
50     version = "1.5";
51     src =  fetchFromGitHub {
52       repo = "agda-stdlib";
53       owner = "agda";
54       rev = "v1.5";
55       hash = "sha256-nEyxYGSWIDNJqBfGpRDLiOAnlHJKEKAOMnIaqfVZzJk=";
56     };
57   }))
59 ```
61 If you want to use a library not added to Nixpkgs, you can add a
62 dependency to a local library by calling `agdaPackages.mkDerivation`.
64 ```nix
65 agda.withPackages (p: [
66   (p.mkDerivation {
67     pname = "your-agda-lib";
68     version = "1.0.0";
69     src = /path/to/your-agda-lib;
70   })
72 ```
74 Again you can reference GitHub
76 ```nix
77 agda.withPackages (p: [
78   (p.mkDerivation {
79     pname = "your-agda-lib";
80     version = "1.0.0";
81     src = fetchFromGitHub {
82       repo = "repo";
83       owner = "owner";
84       version = "...";
85       rev = "...";
86       hash = "...";
87     };
88   })
90 ```
92 See [Building Agda Packages](#building-agda-packages) for more information on `mkDerivation`.
94 Agda will not by default use these libraries. To tell Agda to use a library we have some options:
96 * Call `agda` with the library flag:
97   ```ShellSession
98   $ agda -l standard-library -i . MyFile.agda
99   ```
100 * Write a `my-library.agda-lib` file for the project you are working on which may look like:
101   ```
102   name: my-library
103   include: .
104   depend: standard-library
105   ```
106 * Create the file `~/.agda/defaults` and add any libraries you want to use by default.
108 More information can be found in the [official Agda documentation on library management](https://agda.readthedocs.io/en/v2.6.1/tools/package-system.html).
110 ## Compiling Agda {#compiling-agda}
112 Agda modules can be compiled using the GHC backend with the `--compile` flag. A version of `ghc` with `ieee754` is made available to the Agda program via the `--with-compiler` flag.
113 This can be overridden by a different version of `ghc` as follows:
115 ```nix
116 agda.withPackages {
117   pkgs = [ /* ... */ ];
118   ghc = haskell.compiler.ghcHEAD;
122 ## Writing Agda packages {#writing-agda-packages}
124 To write a nix derivation for an Agda library, first check that the library has a `*.agda-lib` file.
126 A derivation can then be written using `agdaPackages.mkDerivation`. This has similar arguments to `stdenv.mkDerivation` with the following additions:
128 * `everythingFile` can be used to specify the location of the `Everything.agda` file, defaulting to `./Everything.agda`. If this file does not exist then either it should be patched in or the `buildPhase` should be overridden (see below).
129 * `libraryName` should be the name that appears in the `*.agda-lib` file, defaulting to `pname`.
130 * `libraryFile` should be the file name of the `*.agda-lib` file, defaulting to `${libraryName}.agda-lib`.
132 Here is an example `default.nix`
134 ```nix
135 { nixpkgs ?  <nixpkgs> }:
136 with (import nixpkgs {});
137 agdaPackages.mkDerivation {
138   version = "1.0";
139   pname = "my-agda-lib";
140   src = ./.;
141   buildInputs = [
142     agdaPackages.standard-library
143   ];
147 ### Building Agda packages {#building-agda-packages}
149 The default build phase for `agdaPackages.mkDerivation` runs `agda` on the `Everything.agda` file.
150 If something else is needed to build the package (e.g. `make`) then the `buildPhase` should be overridden.
151 Additionally, a `preBuild` or `configurePhase` can be used if there are steps that need to be done prior to checking the `Everything.agda` file.
152 `agda` and the Agda libraries contained in `buildInputs` are made available during the build phase.
154 ### Installing Agda packages {#installing-agda-packages}
156 The default install phase copies Agda source files, Agda interface files (`*.agdai`) and `*.agda-lib` files to the output directory.
157 This can be overridden.
159 By default, Agda sources are files ending on `.agda`, or literate Agda files ending on `.lagda`, `.lagda.tex`, `.lagda.org`, `.lagda.md`, `.lagda.rst`. The list of recognised Agda source extensions can be extended by setting the `extraExtensions` config variable.
161 ## Maintaining the Agda package set on Nixpkgs {#maintaining-the-agda-package-set-on-nixpkgs}
163 We are aiming at providing all common Agda libraries as packages on `nixpkgs`,
164 and keeping them up to date.
165 Contributions and maintenance help is always appreciated,
166 but the maintenance effort is typically low since the Agda ecosystem is quite small.
168 The `nixpkgs` Agda package set tries to take up a role similar to that of [Stackage](https://www.stackage.org/) in the Haskell world.
169 It is a curated set of libraries that:
171 1. Always work together.
172 2. Are as up-to-date as possible.
174 While the Haskell ecosystem is huge, and Stackage is highly automatised,
175 the Agda package set is small and can (still) be maintained by hand.
177 ### Adding Agda packages to Nixpkgs {#adding-agda-packages-to-nixpkgs}
179 To add an Agda package to `nixpkgs`, the derivation should be written to `pkgs/development/libraries/agda/${library-name}/` and an entry should be added to `pkgs/top-level/agda-packages.nix`. Here it is called in a scope with access to all other Agda libraries, so the top line of the `default.nix` can look like:
181 ```nix
182 { mkDerivation, standard-library, fetchFromGitHub }:
186 Note that the derivation function is called with `mkDerivation` set to `agdaPackages.mkDerivation`, therefore you
187 could use a similar set as in your `default.nix` from [Writing Agda Packages](#writing-agda-packages) with
188 `agdaPackages.mkDerivation` replaced with `mkDerivation`.
190 Here is an example skeleton derivation for iowa-stdlib:
192 ```nix
193 mkDerivation {
194   version = "1.5.0";
195   pname = "iowa-stdlib";
197   src = <...>;
199   libraryFile = "";
200   libraryName = "IAL-1.3";
202   buildPhase = ''
203     patchShebangs find-deps.sh
204     make
205   '';
209 This library has a file called `.agda-lib`, and so we give an empty string to `libraryFile` as nothing precedes `.agda-lib` in the filename. This file contains `name: IAL-1.3`, and so we let `libraryName =  "IAL-1.3"`. This library does not use an `Everything.agda` file and instead has a Makefile, so there is no need to set `everythingFile` and we set a custom `buildPhase`.
211 When writing an Agda package it is essential to make sure that no `.agda-lib` file gets added to the store as a single file (for example by using `writeText`). This causes Agda to think that the nix store is a Agda library and it will attempt to write to it whenever it typechecks something. See [https://github.com/agda/agda/issues/4613](https://github.com/agda/agda/issues/4613).
213 In the pull request adding this library,
214 you can test whether it builds correctly by writing in a comment:
217 @ofborg build agdaPackages.iowa-stdlib
220 ### Maintaining Agda packages {#agda-maintaining-packages}
222 As mentioned before, the aim is to have a compatible, and up-to-date package set.
223 These two conditions sometimes exclude each other:
224 For example, if we update `agdaPackages.standard-library` because there was an upstream release,
225 this will typically break many reverse dependencies,
226 i.e. downstream Agda libraries that depend on the standard library.
227 In `nixpkgs` we are typically among the first to notice this,
228 since we have build tests in place to check this.
230 In a pull request updating e.g. the standard library, you should write the following comment:
233 @ofborg build agdaPackages.standard-library.passthru.tests
236 This will build all reverse dependencies of the standard library,
237 for example `agdaPackages.agda-categories`, or `agdaPackages.generic`.
239 In some cases it is useful to build _all_ Agda packages.
240 This can be done with the following Github comment:
243 @ofborg build agda.passthru.tests.allPackages
246 Sometimes, the builds of the reverse dependencies fail because they have not yet been updated and released.
247 You should drop the maintainers a quick issue notifying them of the breakage,
248 citing the build error (which you can get from the ofborg logs).
249 If you are motivated, you might even send a pull request that fixes it.
250 Usually, the maintainers will answer within a week or two with a new release.
251 Bumping the version of that reverse dependency should be a further commit on your PR.
253 In the rare case that a new release is not to be expected within an acceptable time,
254 mark the broken package as broken by setting `meta.broken = true;`.
255 This will exclude it from the build test.
256 It can be added later when it is fixed,
257 and does not hinder the advancement of the whole package set in the meantime.