How to make library installed from OPAM available to OCaml?
Asked Answered
O

1

5

I followed this tutorial on OCaml FFI and installed Ctypes through OPAM:

opam install ctypes

However, OCaml does not find the module:

open Ctypes
(* ... *)

I receive the error:

Unbound module Ctypes

It looks like I need to let OCaml know where my Ctypes installation is? Do I need to update some path variable to let OCaml look for my libraries installed through OPAM?

This is Ubuntu 15.04, OCaml 4.01.0, OPAM 1.2.0.

Orotund answered 6/5, 2015 at 0:29 Comment(1)
What build tool do you use? Could you show us how you compile your code?Keim
P
9

Installing something on your system doesn't make it automatically visible for the compiler, this is true not only for OCaml, but for most conventional systems, like C or C++ to name a few.

That means that you need to pass some flags to the compiler, or to write Makefiles, or to use some project management systems.

In OCaml we have quite a mature infrastructure that plays very well with opam in particular. I do not want to go very deeply in explanations, just a fast overview.

ocamlfind tool is used to find libraries on your system. It is somewhat close to pkg-config in idea, but quite different in design. It wraps compiler tools in order to pass options to them.

ocamlbuild is a fancy swiss-knife that is a must have in the arsenal of every OCamler. It is a tool that knows all other tools, and how to glue them together. I would say that it is the preferred way to compile your projects, especially small one.

oasis is close to autotools in the spirit, but not that generic and is written in the premise, that it should be very easy to use. And indeed it is very easy, but still quite flexible and powerful.

With this overview in mind, we can go directly to your problem. So you've installed ctypes. Now let's take a look on how ctypes package is visible in your system from the ocamlfind perspective. The easiest way would be to list all packages, visible to ocamlfind and find ctypes there:

$ ocamlfind list | grep ctypes
ctypes              (version: 0.4.1)
ctypes.foreign      (version: 0.4.1)
ctypes.stubs        (version: 0.4.1)
ctypes.top          (version: 0.4.1)

So, it looks like, that under the ctypes umbrella there're 4 libraries. One basic library, and some extra libraries, that provides some functionality, that is not needed by default.

No let's try to use them with ocamlbuild

ocamlbuild -package ctypes yourprogram.native

Or, without ocamlbuild directly with ocamlfind:

ocamlfind ocamlopt -package ctypes yourprogram.ml -o yourprogram.native

As you may see, there is a package option, to which you can pass a name of the package as found by ocamlfind, and it will be automagically made visible to the compiler.

Proletariat answered 6/5, 2015 at 1:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.