package ocaml_plugin

  1. Overview
  2. Docs
Automatically build and dynlink OCaml source files

Install

Dune Dependency

Authors

Maintainers

Sources

ocaml_plugin-v0.11.0.tar.gz
md5=d9529955e98816c9bd53a9e54457f979

Description

Published: 22 Mar 2018

README

ocaml_plugin - a wrapper around dynlink for OCaml

ocaml_plugin is a library meant to make dynlink more easier. It offers a high-level kind of api where you can get a first class module out of a few ml source files, while handling the compilation of the files automatically.

Installation via opam

ocaml_plugin can be installed via opam:

$ opam install ocaml_plugin

Usage

A simple example is provided under the hello_world directory. A recommended set-up usually involves 2 steps in the code

  • defining the interface of the plugin, as well as an univ value

  • applying a functor to get a customized plugin loader plugin_intf.ml:

module type S = sig
  val message : string
end
let univ_constr =
  (Univ_constr.create "Plugin_intf.S" sexp_of_opaque : (module S) Univ_constr.t)

run.ml:

module Plugin = Compiler.Make(struct
  type t = (module Plugin_intf.S)
  let t_repr = "Plugin_intf.S"
  let univ_constr = Plugin_intf.univ_constr
  let univ_constr_repr = "Plugin_intf.univ_constr"
end)
Plugin.load_ocaml_src_files (files:string list) >>= function
| Error err ->
  Printf.eprintf "loading failed:\n%s%!" (Error.to_string_hum err)
| Ok plugin ->
  let module M = (val plugin : Plugin_intf.S) in
  Printf.printf "loaded plugin's message : %S\n%!" M.message

Standalone executable

It is possible to embed the compiler in an executable such that a full ocaml environment is not mandatory to actually load plugins. The way it is done in this version of the library is by embedding ocamlopt.opt and some cmi files inside a tgz archive that is getting amended at the end of the exec. At runtime, this archive is extracted into a temporary directory where the compilation will happen. To create this standalone version of an exec (exec+ocamlopt+cmi), you would typically run something like:

$ ../bin/ocaml_embed_compiler.exe -exe ./run.exe -cc $(which ocamlopt) \
     dsl.cmi ../lib/ocaml_plugin.cmi $(ocamlopt -where)/pervasives.cmi \
     -o ./run-standalone.exe

opam will install this executable as ocaml-embed-compiler.

Dependencies (7)

  1. ocaml-migrate-parsetree >= "1.0" & < "2.0.0"
  2. jbuilder >= "1.0+beta18.1"
  3. sexplib >= "v0.11" & < "v0.12"
  4. ppx_jane >= "v0.11" & < "v0.12"
  5. core >= "v0.11" & < "v0.12"
  6. async >= "v0.11" & < "v0.12"
  7. ocaml >= "4.04.1"

Dev Dependencies

None

Used by (1)

  1. jenga >= "v0.11.0"

Conflicts (1)

  1. jbuilder = "1.0+beta19"