Home Explore Blog Models CI



nixpkgs

1st chunk of `doc/languages-frameworks/ocaml.section.md`
ccb6c5363665ef6a1066456ca9da71f67b5c29a82b731b7d0000000100000a4a
# 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 Integration and Packaging in Nix
Summary
This document outlines how OCaml compilers, libraries, and applications are managed within the Nix ecosystem. It explains how to access specific OCaml compiler versions (e.g., `ocaml-ng.ocamlPackages_X_XX`) or a recent version via the `ocamlPackages` alias, and how to set up a development shell using `nativeBuildInputs` and `buildInputs` with a provided Nix example. Additionally, it details the packaging process for OCaml libraries, specifying the installation path and introducing `buildDunePackage` as a convenience function for projects built with Dune. It also covers attributes like `minimalOCamlVersion` and `duneVersion` for package configuration.