This page has instructions for setting up a modern OCaml development environment.
These instructions have been tested on
- macOS 10.13.6
- Debian 9.8
- Fedora 29
- Ubuntu 16.04.6 LTS
- Windows 10 1810 with Ubuntu 18.04.2 LTS
They should work on other versions of macOS and mainstream Linux distributions.
At least on my system, installing opam required sudo privilege, but
everything else requires only ordinary user privileges.
I assume git is already installed.
The first step is to install opam, the OCaml package manager. (We will also
need m4, a tool used by certain packages to preprocess OCaml code).
If you already have opam installed, you can skip this step.
On Debian:
apt-get install -y m4At present, it is necessary to download the binary directly:
wget https://github.com/ocaml/opam/releases/download/2.0.3/opam-2.0.3-x86_64-linuxand put it somewhere in your PATH with the name opam.
On Ubuntu (including running in WSL):
add-apt-repository ppa:avsm/ppa
apt update
apt install -y opam m4For WSL, you should also apt install gcc, binutils-dev, make and pkg-config
On macOS (using Homebrew):
brew install -y opam m4Or, if you prefer not to use Homebrew, you can download a binary directly
(just put it somewhere in your PATH with the name opam):
wget https://github.com/ocaml/opam/releases/download/2.0.3/opam-2.0.3-x86_64-darwinNext we initialize the opam installation and pull down the latest OCaml
compiler. This step will take a little while, because opam will build the
OCaml compiler from source.
For WSL, you must also include --disable-sandboxing with opam init
opam init -y --compiler=4.07.1
eval $(opam env)If you already have opam installed and initialized, do this instead to
switch to 4.07.1:
opam switch create 4.07.1
eval $(opam env)If you get an error like this:
bash[ERROR] Compiler selection '4.07.1' is ambiguous. matching packages: { ocaml-base-compiler.4.07.1, ocaml-system.4.07.1 }
pick the system one:
opam switch create ocaml-system.4.07.1
eval $(opam env)Follow the prompts and put eval $(opam env) in the appropriate
rcfile for your shell (eg ~~/.bashrc~) to set up paths and so forth. Alternatively,
you can pass -a to opam init, and opam will set-up the files for you.
Update opam’s local cache of available packages and upgrade any packages
already installed.
opam update -uyNext we’ll install a set of basic libraries that you’ll need for this workshop:
opam install -y async core js_of_ocaml js_of_ocaml-ppx merlin utop ocp-indentClone this repo and cd to the directory with these instructions:
git clone https://github.com/ocamllabs/install-ocaml
cd install-ocaml/01-hello-worldThen build and run the hello_world program here, like so:
dune build hello_world.exe
dune exec ./hello_world.exeThis should print Hello, World.
One pattern that we’ll make a lot of use of at the workshop is expect tests. If you’ve never heard of expect tests, check out our blog post for an overview.
cd to the 02-expect-tests directory in this repo and run this:
dune runtestIf the installation worked successfully, this should produce output that looks like this:
Done: 87/89 (jobs: 1)File "expect_test_example.ml", line 1, characters 0-0:
diff (internal) (exit 1)
(cd _build/default && /usr/bin/diff -u expect_test_example.ml expect_test_example.ml.corrected)
--- expect_test_example.ml 2018-02-26 01:37:02.000000000 +0000
+++ expect_test_example.ml.corrected 2018-02-26 04:36:48.800103324 +0000
@@ -2,5 +2,5 @@
let%expect_test _ =
let () = printf "foo" in
- [%expect {| bar |}]
+ [%expect {| foo |}]
;;This indicates a failed test because there is a diff between what we said the
program would output (bar), and what it actually output (foo).
If the test is right and the program wrong, you would fix the program. But if it’s the test that’s wrong, accept the diff like so:
dune promoteThis overwrites expect_test_example.ml with a corrected version that
expects the output that the program actually produced in the previous run.
Running the tests again will result in them passing:
dune runtest # no output
git diff # expect_test_example.ml has been overwrittenopam user-setup installwill set up vim and/or emacs (whichever ones you have installed) with syntax highlighting, indentation, go-to-definition and printing the types of expressions.
To learn more, visit https://github.com/OCamlPro/opam-user-setup.
We recommend the vscode-reasonml plugin. Note that on WSL, it’s not presently possible to link merlin from WSL with VS Code running natively.
This is probably because you have an older version of core installed. To reinstall:
opam update -uyand if the problem persists:
opam reinstall -y ppx_inline_test ppx_expect