nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at master 142 lines 5.1 kB view raw view rendered
1# OCaml {#sec-language-ocaml} 2 3## User guide {#sec-language-ocaml-user-guide} 4 5OCaml libraries are available in attribute sets of the form `ocaml-ng.ocamlPackages_X_XX` where X is to be replaced with the desired compiler version. For example, ocamlgraph compiled with OCaml 4.12 can be found in `ocaml-ng.ocamlPackages_4_12.ocamlgraph`. The compiler itself is also located in this set, under the name `ocaml`. 6 7If you don't care about the exact compiler version, `ocamlPackages` is a top-level alias pointing to a recent version of OCaml. 8 9OCaml applications are usually available top-level, and not inside `ocamlPackages`. Notable exceptions are build tools that must be built with the same compiler version as the compiler you intend to use like `dune` or `ocaml-lsp`. 10 11To open a shell able to build a typical OCaml project, put the dependencies in `buildInputs` and add `ocamlPackages.ocaml` and `ocamlPackages.findlib` to `nativeBuildInputs` at least. 12For example: 13```nix 14let 15 pkgs = import <nixpkgs> { }; 16 # choose the ocaml version you want to use 17 ocamlPackages = pkgs.ocaml-ng.ocamlPackages_4_12; 18in 19pkgs.mkShell { 20 # build tools 21 nativeBuildInputs = with ocamlPackages; [ 22 ocaml 23 findlib 24 pkgs.dune 25 ocaml-lsp 26 ]; 27 # dependencies 28 buildInputs = with ocamlPackages; [ ocamlgraph ]; 29} 30``` 31 32## Packaging guide {#sec-language-ocaml-packaging} 33 34OCaml libraries should be installed in `$(out)/lib/ocaml/${ocaml.version}/site-lib/`. Such directories are automatically added to the `$OCAMLPATH` environment variable when building another package that depends on them or when opening a `nix-shell`. 35 36Given 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`. 37 38Here is a simple package example. 39 40- It defines an (optional) attribute `minimalOCamlVersion` (see note below) 41 that will be used to throw a descriptive evaluation error if building with 42 an older OCaml is attempted. 43 44- It uses the `fetchFromGitHub` fetcher to get its source. 45 46- It also accepts a `duneVersion` parameter (valid values are `"2"`, and 47 `"3"`). The recommended practice is to set it only if you don't want the 48 default value and/or it depends on something else like package version. 49 50- It sets the optional `doCheck` attribute such that tests will be run with 51 `dune runtest -p angstrom` after the build (`dune build -p angstrom`) is 52 complete, but only if the OCaml version is at least `"4.05"`. 53 54- It uses the package `ocaml-syntax-shims` as a build input, `alcotest` and 55 `ppx_let` as check inputs (because they are needed to run the tests), and 56 `bigstringaf` and `result` as propagated build inputs (thus they will also be 57 available to libraries depending on this library). 58 59- The library will be installed using the `angstrom.install` file that dune 60 generates. 61 62```nix 63{ 64 lib, 65 fetchFromGitHub, 66 buildDunePackage, 67 ocaml, 68 ocaml-syntax-shims, 69 alcotest, 70 result, 71 bigstringaf, 72 ppx_let, 73}: 74 75buildDunePackage (finalAttrs: { 76 pname = "angstrom"; 77 version = "0.15.0"; 78 79 minimalOCamlVersion = "4.04"; 80 81 src = fetchFromGitHub { 82 owner = "inhabitedtype"; 83 repo = "angstrom"; 84 tag = finalAttrs.version; 85 hash = "sha256-MK8o+iPGANEhrrTc1Kz9LBilx2bDPQt7Pp5P2libucI="; 86 }; 87 88 buildInputs = [ ocaml-syntax-shims ]; 89 90 propagatedBuildInputs = [ 91 bigstringaf 92 result 93 ]; 94 95 doCheck = lib.versionAtLeast ocaml.version "4.05"; 96 checkInputs = [ 97 alcotest 98 ppx_let 99 ]; 100 101 meta = { 102 homepage = "https://github.com/inhabitedtype/angstrom"; 103 description = "OCaml parser combinators built for speed and memory efficiency"; 104 license = lib.licenses.bsd3; 105 maintainers = with lib.maintainers; [ sternenseemann ]; 106 }; 107}) 108``` 109 110Here 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. 111 112```nix 113{ 114 lib, 115 fetchurl, 116 buildDunePackage, 117}: 118 119buildDunePackage (finalAttrs: { 120 pname = "wtf8"; 121 version = "1.0.2"; 122 123 minimalOCamlVersion = "4.02"; 124 125 src = fetchurl { 126 url = "https://github.com/flowtype/ocaml-wtf8/releases/download/v${finalAttrs.version}/wtf8-v${finalAttrs.version}.tbz"; 127 hash = "sha256-d5/3KUBAWRj8tntr4RkJ74KWW7wvn/B/m1nx0npnzyc="; 128 }; 129 130 meta = { 131 homepage = "https://github.com/flowtype/ocaml-wtf8"; 132 description = "WTF-8 is a superset of UTF-8 that allows unpaired surrogates"; 133 license = lib.licenses.mit; 134 maintainers = [ lib.maintainers.eqyiel ]; 135 }; 136}) 137``` 138 139The build will automatically fail if two distinct versions of the same library 140are added to `buildInputs` (which usually happens transitively because of 141`propagatedBuildInputs`). Set `dontDetectOcamlConflicts` to true to disable this 142behavior.