From d26902aef932e80eb772026433af13ce662e7872 Mon Sep 17 00:00:00 2001 From: Graham Fawcett Date: Tue, 22 Jun 2021 12:53:27 -0400 Subject: [PATCH] Refresh the Ocaml package examples; document `useDune2` (#127520) The current example in the manual no longer builds, mainly because `useDune2 = true` is required, but also because the inputs have changed. The new examples are copied verbatim from nixpkgs. --- doc/languages-frameworks/ocaml.section.md | 73 +++++++++++++++-------- 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/doc/languages-frameworks/ocaml.section.md b/doc/languages-frameworks/ocaml.section.md index 9b92a80f4712..5ffc23173d6d 100644 --- a/doc/languages-frameworks/ocaml.section.md +++ b/doc/languages-frameworks/ocaml.section.md @@ -4,60 +4,83 @@ OCaml libraries should be installed in `$(out)/lib/ocaml/${ocaml.version}/site-l Given that most of the OCaml ecosystem is now built with dune, nixpkgs includes a convenience build support function called `buildDunePackage` that will build an OCaml package using dune, OCaml and findlib and any additional dependencies provided as `buildInputs` or `propagatedBuildInputs`. -Here is a simple package example. It defines an (optional) attribute `minimumOCamlVersion` that will be used to throw a descriptive evaluation error if building with an older OCaml is attempted. It uses the `fetchFromGitHub` fetcher to get its source. It sets the `doCheck` (optional) attribute to `true` which means that tests will be run with `dune runtest -p angstrom` after the build (`dune build -p angstrom`) is complete. It uses `alcotest` as a build input (because it is needed to run the tests) and `bigstringaf` and `result` as propagated build inputs (thus they will also be available to libraries depending on this library). The library will be installed using the `angstrom.install` file that dune generates. +Here is a simple package example. + +- It defines an (optional) attribute `minimalOCamlVersion` that will be used to + throw a descriptive evaluation error if building with an older OCaml is + attempted. + +- It uses the `fetchFromGitHub` fetcher to get its source. + +- `useDune2 = true` ensures that the latest version of Dune is used for the + build (this may become the default value in a future release). + +- It sets the optional `doCheck` attribute such that tests will be run with + `dune runtest -p angstrom` after the build (`dune build -p angstrom`) is + complete, but only if the Ocaml version is at at least `"4.05"`. + +- It uses the package `ocaml-syntax-shims` as a build input, `alcotest` and + `ppx_let` as check inputs (because they are needed to run the tests), and + `bigstringaf` and `result` as propagated build inputs (thus they will also be + available to libraries depending on this library). + +- The library will be installed using the `angstrom.install` file that dune + generates. ```nix -{ lib -, fetchFromGitHub -, buildDunePackage -, alcotest -, result -, bigstringaf -}: +{ lib, + fetchFromGitHub, + buildDunePackage, + ocaml, + ocaml-syntax-shims, + alcotest, + result, + bigstringaf, + ppx_let }: buildDunePackage rec { pname = "angstrom"; - version = "0.10.0"; + version = "0.15.0"; + useDune2 = true; - minimumOCamlVersion = "4.03"; + minimalOCamlVersion = "4.04"; src = fetchFromGitHub { owner = "inhabitedtype"; repo = pname; rev = version; - sha256 = "0lh6024yf9ds0nh9i93r9m6p5psi8nvrqxl5x7jwl13zb0r9xfpw"; + sha256 = "1hmrkdcdlkwy7rxhngf3cv3sa61cznnd9p5lmqhx20664gx2ibrh"; }; - buildInputs = [ alcotest ]; + checkInputs = [ alcotest ppx_let ]; + buildInputs = [ ocaml-syntax-shims ]; propagatedBuildInputs = [ bigstringaf result ]; - doCheck = true; + doCheck = lib.versionAtLeast ocaml.version "4.05"; - meta = with lib; { + meta = { homepage = "https://github.com/inhabitedtype/angstrom"; description = "OCaml parser combinators built for speed and memory efficiency"; - license = licenses.bsd3; - maintainers = with maintainers; [ sternenseemann ]; + license = lib.licenses.bsd3; + maintainers = with lib.maintainers; [ sternenseemann ]; }; -} ``` Here is a second example, this time using a source archive generated with `dune-release`. It is a good idea to use this archive when it is available as it will usually contain substituted variables such as a `%%VERSION%%` field. This library does not depend on any other OCaml library and no tests are run after building it. ```nix -{ lib -, fetchurl -, buildDunePackage -}: +{ lib, fetchurl, buildDunePackage }: buildDunePackage rec { pname = "wtf8"; - version = "1.0.1"; + version = "1.0.2"; - minimumOCamlVersion = "4.01"; + useDune2 = true; + + minimalOCamlVersion = "4.02"; src = fetchurl { - url = "https://github.com/flowtype/ocaml-${pname}/releases/download/v${version}/${pname}-${version}.tbz"; - sha256 = "1msg3vycd3k8qqj61sc23qks541cxpb97vrnrvrhjnqxsqnh6ygq"; + url = "https://github.com/flowtype/ocaml-${pname}/releases/download/v${version}/${pname}-v${version}.tbz"; + sha256 = "09ygcxxd5warkdzz17rgpidrd0pg14cy2svvnvy1hna080lzg7vp"; }; meta = with lib; {