Home Explore Blog CI



nixpkgs

1st chunk of `doc/languages-frameworks/ocaml.section.md`
a97afe4e499ddbc55e7b06ad52f945e58ec62e0267a3df020000000100000a4a
# OCaml {#sec-language-ocaml}

## User guide {#sec-language-ocaml-user-guide}

OCaml 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`.

If you don't care about the exact compiler version, `ocamlPackages` is a top-level alias pointing to a recent version of OCaml.

OCaml 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`.

To 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.
For example:
```nix
let
  pkgs = import <nixpkgs> { };
  # choose the ocaml version you want to use
  ocamlPackages = pkgs.ocaml-ng.ocamlPackages_4_12;
in
pkgs.mkShell {
  # build tools
  nativeBuildInputs = with ocamlPackages; [
    ocaml
    findlib
    dune_2
    ocaml-lsp
  ];
  # dependencies
  buildInputs = with ocamlPackages; [ ocamlgraph ];
}
```

## Packaging guide {#sec-language-ocaml-packaging}

OCaml 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`.

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 `minimalOCamlVersion` (see note below)
  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 also accepts a `duneVersion` parameter (valid values are `"1"`, `"2"`, and
  `"3"`). The recommended practice is to set it only if you don't want the default
  value and/or it depends on something else like package version. You might see
  a not-supported argument `useDune2`. The behavior was `useDune2 = true;` =>
  `duneVersion = "2";` and `useDune2 = false;` => `duneVersion = "1";`. It was
  used at the time when dune3 didn't exist.

Title: OCaml in Nixpkgs: User and Packaging Guide
Summary
This section provides a guide to using OCaml libraries and packaging OCaml applications within the Nixpkgs environment. It covers how to access OCaml libraries for specific compiler versions, set up a development shell with necessary build tools and dependencies, and package OCaml libraries using `buildDunePackage` for easier integration with the Nix ecosystem. It also mentions the `minimalOCamlVersion` attribute for specifying the minimum required OCaml version and the `duneVersion` parameter for controlling the dune build system version.