OCaml
Most packages related to OCaml, in particular the OCaml compiler and many libraries, belong to the ocamlPackages attribute set of nixpkgs.
Findlib, ocamlfind
OCaml libraries are usually located using [findlib] and the associated ocamlfind tool. These tools are found under the ocamlPackages.findlib attribute and rely on the OCAMLPATH environment variable.
A hook in the findlib package will automatically populate this variable with the paths to the other libraries. For instance, when starting a shell with
nix-shell --packages ocamlPackages.findlib ocamlPackages.batteries
will set the OCAMLPATH variable so that ocamlfind can locate the batteries library.
This hook also sets the CAML_LD_LIBRARY_PATH environment variable that is used for locating the dynamically loaded shared libraries (aka stublibs).
Using Emacs
[Tuareg] is an Emacs OCaml mode. It can be installed with
nix-env -iA nixpkgs.emacsPackagesNg.tuareg
.
Emacs must be configured to be able to find this package: you may need to add a line like this to your .emacs file, somewhere between (require 'package)
and (package-initialize)
:
(add-to-list 'package-directory-list "~/.nix-profile/share/emacs/site-lisp/elpa")
There is some more documentation in the [nixpkgs sources].
[Merlin] provides additional functionality to Emacs. It can be installed through nix-env -iA nixpkgs.ocamlPackages.merlin
.
Beware that merlin is specific to one particular version of OCaml (it won’t work correctly with a compiler of a different version).
To configure Emacs and enable the merlin mode, add the following to your .emacs:
(add-to-list 'load-path "~/.nix-profile/share/emacs/site-lisp") (require 'merlin) (add-hook 'tuareg-mode-hook 'merlin-mode t)
Also, a specific variable (merlin-command) of the merlin mode must be overridden (its default is opam):
(custom-set-variables '(merlin-command "ocamlmerlin") )
A useful complement to merlin is [ocp-indent], a customizable tool to indent OCaml code. It can be installed using nix-env -iA nixpkgs.ocamlPackages.ocpIndent
. To enable it in Emacs, don’t forget to add the following line to your .emacs:
(require 'ocp-indent)
Specific version of the OCaml compiler
Various versions of the ocamlPackage attribute set are available, corresponding to various versions of OCaml. For instance, the attribute set ocaml-ng.ocamlPackages_4_04' contains the OCaml compiler at version 4.04 and OCaml libraries compiled with that particular compiler.