···158158159159By 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.
160160161161-## Adding Agda packages to Nixpkgs {#adding-agda-packages-to-nixpkgs}
161161+## Maintaining the Agda package set on Nixpkgs {#maintaining-the-agda-package-set-on-nixpkgs}
162162+163163+We are aiming at providing all common Agda libraries as packages on `nixpkgs`,
164164+and keeping them up to date.
165165+Contributions and maintenance help is always appreciated,
166166+but the maintenance effort is typically low since the Agda ecosystem is quite small.
167167+168168+The `nixpkgs` Agda package set tries to take up a role similar to that of [Stackage](https://www.stackage.org/) in the Haskell world.
169169+It is a curated set of libraries that:
170170+171171+1. Always work together.
172172+2. Are as up-to-date as possible.
173173+174174+While the Haskell ecosystem is huge, and Stackage is highly automatised,
175175+the Agda package set is small and can (still) be maintained by hand.
176176+177177+### Adding Agda packages to Nixpkgs {#adding-agda-packages-to-nixpkgs}
162178163179To 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:
164180···192208This 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`.
193209194210When 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).
211211+212212+In the pull request adding this library,
213213+you can test whether it builds correctly by writing in a comment:
214214+215215+```
216216+@ofborg build agdaPackages.iowa-stdlib
217217+```
218218+219219+### Maintaining Agda packages
220220+221221+As mentioned before, the aim is to have a compatible, and up-to-date package set.
222222+These two conditions sometimes exclude each other:
223223+For example, if we update `agdaPackages.standard-library` because there was an upstream release,
224224+this will typically break many reverse dependencies,
225225+i.e. downstream Agda libraries that depend on the standard library.
226226+In `nixpkgs` we are typically among the first to notice this,
227227+since we have build tests in place to check this.
228228+229229+In a pull request updating e.g. the standard library, you should write the following comment:
230230+231231+```
232232+@ofborg build agdaPackages.standard-library.passthru.tests
233233+```
234234+235235+This will build all reverse dependencies of the standard library,
236236+for example `agdaPackages.agda-categories`, or `agdaPackages.generic`.
237237+238238+In some cases it is useful to build _all_ Agda packages.
239239+This can be done with the following Github comment:
240240+241241+```
242242+@ofborg build agda.passthru.tests.allPackages
243243+```
244244+245245+Sometimes, the builds of the reverse dependencies fail because they have not yet been updated and released.
246246+You should drop the maintainers a quick issue notifying them of the breakage,
247247+citing the build error (which you can get from the ofborg logs).
248248+If you are motivated, you might even send a pull request that fixes it.
249249+Usually, the maintainers will answer within a week or two with a new release.
250250+Bumping the version of that reverse dependency should be a further commit on your PR.
251251+252252+In the rare case that a new release is not to be expected within an acceptable time,
253253+simply mark the broken package as broken by setting `meta.broken = true;`.
254254+This will exclude it from the build test.
255255+It can be added later when it is fixed,
256256+and does not hinder the advancement of the whole package set in the meantime.
+5
pkgs/build-support/agda/default.nix
···7979 find -not \( -path ${everythingFile} -or -path ${lib.interfaceFile everythingFile} \) -and \( ${concatMapStringsSep " -or " (p: "-name '*.${p}'") (extensions ++ extraExtensions)} \) -exec cp -p --parents -t "$out" {} +
8080 runHook postInstall
8181 '';
8282+8283 meta = if meta.broken or false then meta // { hydraPlatforms = lib.platforms.none; } else meta;
8484+8585+ # Retrieve all packages from the finished package set that have the current package as a dependency and build them
8686+ passthru.tests = with builtins;
8787+ lib.filterAttrs (name: pkg: self.lib.isUnbrokenAgdaPackage pkg && elem pname (map (pkg: pkg.pname) pkg.buildInputs)) self;
8388 };
8489in
8590{
+5
pkgs/build-support/agda/lib.nix
···77 * interfaceFile "src/Everything.lagda.tex" == "src/Everything.agdai"
88 */
99 interfaceFile = agdaFile: lib.head (builtins.match ''(.*\.)l?agda(\.(md|org|rst|tex))?'' agdaFile) + "agdai";
1010+1111+ /* Takes an arbitrary derivation and says whether it is an agda library package
1212+ * that is not marked as broken.
1313+ */
1414+ isUnbrokenAgdaPackage = pkg: pkg.isAgdaDerivation or false && !pkg.meta.broken;
1015}